Fix: use UTF-8 without BOM for file encoding