Haruskah file UTF-8 CSV mengandung BOM (tanda urutan byte)?

37

Perangkat lunak lini bisnis kami memungkinkan pengguna untuk menyimpan data tertentu sebagai CSV . Karena ada banyak format berbeda (semuanya disebut "CSV") yang digunakan di alam, kami ingin memutuskan seperti apa bentuk "format default" itu.

  • Mengenai pemisah jalur / bidang dan melarikan diri, ada standar yang bisa kita gunakan: RFC 4180 .

  • Mengenai pengkodean teks, UTF-8 tampaknya telah muncul dalam dekade terakhir sebagai "format file teks default", jadi kami akan menggunakannya.

Satu pertanyaan yang dibiarkan terbuka adalah: Haruskah kita menambahkan BOM di awal atau tidak? Saya telah membaca banyak pendapat dan pro / kontra tentang penggunaan BOM secara umum, tetapi apakah ada rekomendasi "resmi" atau setidaknya semacam konsensus masyarakat tentang penggunaan BOM dalam file CSV?

Heinzi
sumber
7
Jika memiliki BOM maka bukan UTF-8. Tapi format apa yang diinginkan oleh program. Jika mereka membutuhkan BOM (terutama micro-sloth) maka Anda perlu menambahkannya, tetapi UTF-8 + BOM ≠ UTF-8.
ctrl-alt-delor
3
Meskipun CSV tampaknya lebih mudah untuk dibuat, ada begitu banyak masalah kompatibilitas, terutama jika Anda menyimpang dari ASCII 7-bit murni, bahwa saya akan sangat, sangat, sangat menyarankan Anda membuat XLSX yang sebenarnya jika tujuannya adalah agar pengguna dapat membukanya di Excel (alih-alih mengimpornya di beberapa perangkat lunak lain, dalam hal ini Anda harus memberikan opsi untuk pemisah, penyandian, dll.). Ada perpustakaan untuk sebagian besar bahasa di luar sana, dan Anda akan menghemat banyak waktu bagi Anda dan pengguna Anda.
jcaron
2
Jika Anda mengambil rute CSV, periksa apa yang terjadi ketika Anda membuka file di Mac dan PC, idealnya dengan beberapa versi Excel. Perlu diketahui juga bahwa beberapa versi Excel tidak berperilaku sama ketika Anda mengklik dua kali pada file untuk membukanya atau membuka file melalui menu.
jcaron
2
Mengapa penting jika terbuka dengan benar di Excel? Tidak ada dalam pertanyaan yang menyatakan bahwa Excel harus dapat mengurai file yang dihasilkan ...
rubenvb

Jawaban:

55

Bukan untuk UTF-8 , tetapi lihat berbagai peringatan di komentar.

Tidak perlu (UTF-8 tidak memiliki urutan byte) tidak seperti UTF-16/32 dan tidak direkomendasikan dalam standar Unicode . Sangat jarang untuk melihat UTF-8 dengan BOM "di alam liar", jadi kecuali Anda memiliki alasan yang sah (mis. Seperti dikomentari, Anda akan bekerja dengan perangkat lunak yang mengharapkan BOM). Saya akan merekomendasikan pendekatan BOM-less .

Wikipedia menyebutkan beberapa perangkat lunak Microsoft terutama yang memaksa dan mengharapkan BOM, tetapi kecuali Anda bekerja dengan mereka, jangan menggunakannya.

Kayaman
sumber
28
Ada juga perangkat lunak luas yang membutuhkan BOM: Excel membutuhkan BOM untuk mengidentifikasi dengan benar file CSV sebagai UTF-8 daripada "ANSI", yaitu lokal kompatibilitas lokal. (Tapi Excel juga melakukan hal-hal aneh ketika menyimpan file seperti itu, jadi kami menyarankan pengguna untuk menggunakan ekspor Excel "nyata" kami alih-alih ekspor CSV jika mereka ingin membuka file dengan Excel.)
Heinzi
21
@Heinzi Saya sudah lama tahu bahwa Anda tidak bisa benar-benar menang ketika bekerja dengan CSV dan Excel. Itu hanyalah CSV-reader yang buruk. Sayang sekali itu yang diharapkan pengguna normal.
pipa
9
@ Vooo: Memerlukan BOM untuk UTF-8 tentu saja melanggar standar, mengingat itu " tidak diperlukan atau direkomendasikan ".
Deduplicator
12
@Dupuplikator: Sistem MS-DOS dan Windows memiliki basis besar file teks lawas dalam penyandian selain UTF-8. Aplikasi berkualitas memungkinkan pengguna untuk menentukan bagaimana file teks dikodekan ketika membukanya, tetapi sering menyertakan opsi "otomatis". Jika pengguna memilih "UTF-8", file UTF-8 akan dibuka dengan benar dengan atau tanpa BOM. Jika pengguna memilih "otomatis", beberapa file UTF-8 yang tidak memiliki BOM dapat salah diidentifikasi sebagai menggunakan beberapa pengkodean lainnya. Saya tidak yakin apa yang diharapkan aplikasi untuk dilakukan secara berbeda, karena file yang "salah diidentifikasi" bisa sedikit identik dengan ...
supercat
7
@ Vo: Itu bertentangan dengan banyak persyaratan format khusus lainnya di mana BOM ilegal. Misalnya, skrip shell dengan BOM sebelum #!tidak valid. Paling-paling BOM di UTF-8 "diizinkan, ketika tidak ada persyaratan format / aplikasi khusus yang menghalanginya", tidak "diizinkan", dan karenanya tidak boleh digunakan. Standar sebenarnya jelas tentang TIDAK HARUS.
R ..
8

Masih belum ada konvensi luas AFAIK, meskipun tentu UTF-8 sekarang diterima secara umum.

BOM adalah artefak yang mengerikan:

Itu tidak terlihat (ruang nol-lebar).

Beberapa perangkat lunak mungkin pecah pada nama kolom pertama yang tidak hanya berisi huruf, tetapi BOM aneh di depan.

Baris tajuk mungkin dapat disalin untuk jalur nilai yang merusak nilai pertama.

Hanya diperlukan oleh beberapa perangkat lunak Windows untuk membedakan antara salah satu pengkodean ANSI yang digunakan oleh mesin Windows lokal, dan UTF-8. Notepad, Excel.

Jadi yang menyedihkan adalah seseorang harus mendukung BOM. Mungkin opsional.

Gunakan skema penamaan untuk file (...- utf8.txt, ...- utf8bom.txt).


Dalam banyak kasus kita dapat menggunakan HTML sebagai alternatif ekspor. Ini memungkinkan pengaturan penyandian dalam file. Fitur tambahan adalah pewarnaan latar / latar depan baris dan sel. Yang mempertinggi kualitas ekspor.

Joop Eggen
sumber
15
Apakah memformat "meningkatkan kualitas ekspor" sangat tergantung pada tujuan penggunaan file. CSV sering digunakan sebagai format yang mudah dibaca mesin , dan membuat penerima HTML mem-parsing akan menjadi kerugian besar dalam kasus itu.
IMSoP
5
Jika Anda memilih skema penamaan, ingat audiens. -utf8-windows.csvlebih baik. Hampir semua orang tahu apa itu Windows, dalam konteks komputer, tetapi jauh lebih sedikit pengguna yang tahu apa itu Byte Order Mark.
MSalters
2
@ Davidvis ya jika itu adalah standar yang dikenal luas dikomunikasikan. Kalau tidak, laporan kesalahan akan muncul tschüßmenjadi sampah padahal tschüßseharusnya ditulis. Pada StackOverflow, banyak kesalahan TI tentang penyandian. Pengguna akhir juga akan mengalami masalah.
Joop Eggen
3
@JoopEggen "Standar yang dikomunikasikan secara luas" di komunitas apa sebenarnya? Saya telah melakukan pengembangan perangkat lunak selama hampir 10 tahun sekarang dan saya belum pernah melihatnya - bahkan di windows, dan tentu saja tidak di Linux atau OSX di mana Anda hampir selalu berurusan dengan utf-8.
Cubic
1
@ JustinTime ya sejak beberapa tahun bahkan, tetapi tidak sebelumnya. Pengembang MS tidak seburuk itu (Kepatuhan Posix, sekarang dukungan UTF-8).
Joop Eggen