BOM (byte order mark) adalah karakter U+FEFF yang dipasang di awal berkas. Pada UTF-16 fungsinya menyatakan urutan byte. Pada UTF-8 urutan byte tidak pernah menjadi soal, sehingga BOM di sana hanya berperan sebagai tanda bahwa isinya UTF-8. Unicode menyebut pemakaian itu diizinkan, bukan diwajibkan.
Excel menulis BOM saat berkas disimpan sebagai CSV UTF-8, dan memakainya untuk mengenali encoding ketika berkas itu dibuka kembali. Program lain tidak selalu ikut aturan yang sama. Kalau berkas dibaca dengan encoding utf-8 biasa, tiga byte EF BB BF berubah menjadi satu karakter tak tampak yang menempel di depan nama kolom pertama.
| Cara membaca | Nama kolom pertama | Akibatnya |
|---|---|---|
| encoding="utf-8" | \ufeffnama | baris["nama"] berhenti dengan KeyError |
| encoding="utf-8-sig" | nama | BOM dibuang saat dibaca |
| mode "rb" | byte EF BB BF terlihat | dipakai untuk memeriksa ada tidaknya BOM |
with open("ekspor.csv", encoding="utf-8-sig", newline="") as f:
baris = list(csv.DictReader(f))
print(list(baris[0].keys())[0]) # nama, bukan \ufeffnamaKerusakan ini khas karena nyaris tidak terlihat: berkasnya terbuka normal di spreadsheet, kolomnya bernama benar di layar, dan hanya skrip yang mengeluh. Saat menulis berkas untuk orang lain, encoding utf-8-sig memudahkan Excel; saat menulis untuk sistem lain, utf-8 polos lebih aman.