Apa perbedaan antara UTF-8 dan UTF-8 tanpa BOM ? Mana yang lebih baik?
unicode
utf-8
character-encoding
byte-order-mark
sederhana
sumber
sumber
Jawaban:
BOM UTF-8 adalah urutan byte pada awal aliran teks (
0xEF, 0xBB, 0xBF
) yang memungkinkan pembaca untuk lebih andal menebak file sebagai dikodekan dalam UTF-8.Biasanya, BOM digunakan untuk menandai endianness dari suatu encoding, tetapi karena endianness tidak relevan dengan UTF-8, BOM tidak diperlukan.
Menurut standar Unicode , BOM untuk file UTF-8 tidak disarankan :
sumber
Jawaban bagus lainnya sudah menjawab bahwa:
EF BB BF
Tetapi, sebagai informasi tambahan untuk ini, BOM untuk UTF-8 bisa menjadi cara yang baik untuk "mencium" jika string dikodekan dalam UTF-8 ... Atau bisa juga string yang sah dalam pengkodean lainnya ...
Misalnya, data [EF BB BF 41 42 43] dapat berupa:
Jadi walaupun bisa keren untuk mengenali pengkodean konten file dengan melihat byte pertama, Anda tidak harus bergantung pada ini, seperti yang ditunjukkan oleh contoh di atas
Pengkodean harus diketahui, bukan diramalkan.
sumber
Setidaknya ada tiga masalah dengan menempatkan BOM dalam file yang disandikan UTF-8.
Dan, seperti yang disebutkan orang lain, tidak cukup atau tidak perlu memiliki BOM untuk mendeteksi bahwa ada sesuatu yang UTF-8:
sumber
cat
tidak akan memberi Anda hasil bersih , hasil yang memiliki BOM hanya pada awalnya. Jika Anda bermaksud demikian, maka itu karenacat
bekerja pada level byte, bukan pada level konten yang ditafsirkan, dan dengan cara yang samacat
tidak dapat menangani foto, katakanlah. Tetap saja tidak banyak merugikan. Itu karena BOM mengkodekan nol-lebar ruang tanpa melanggar.Berikut adalah contoh penggunaan BOM yang sebenarnya menyebabkan masalah nyata dan banyak orang tidak mengetahuinya.
BOM memecah skrip
Skrip shell, skrip Perl, skrip Python, skrip Ruby, skrip Node.js, atau skrip executable lainnya yang perlu dijalankan oleh penerjemah - semuanya dimulai dengan garis shebang yang terlihat seperti salah satu di antaranya:
Ini memberi tahu sistem penerjemah mana yang perlu dijalankan ketika menjalankan skrip seperti itu. Jika skrip dikodekan dalam UTF-8, seseorang mungkin tergoda untuk memasukkan BOM di awal. Tapi sebenarnya "#!" karakter bukan hanya karakter. Mereka sebenarnya adalah angka ajaib yang kebetulan terdiri dari dua karakter ASCII. Jika Anda meletakkan sesuatu (seperti BOM) di depan karakter-karakter itu, maka file tersebut akan terlihat seperti memiliki angka ajaib yang berbeda dan itu dapat menyebabkan masalah.
Lihat Wikipedia, artikel: Shebang, bagian: Nomor ajaib :
BOM ilegal di JSON
Lihat RFC 7159, Bagian 8.1 :
BOM berlebihan di JSON
Tidak hanya itu ilegal di JSON, itu juga tidak diperlukan untuk menentukan pengkodean karakter karena ada cara yang lebih dapat diandalkan untuk secara jelas menentukan pengkodean karakter dan endianness yang digunakan dalam aliran JSON apa pun (lihat jawaban ini untuk detail).
BOM memecah parser JSON
Tidak hanya itu ilegal di JSON dan tidak diperlukan , itu benar-benar merusak semua perangkat lunak yang menentukan pengkodean menggunakan metode yang disajikan dalam RFC 4627 :
Menentukan pengkodean dan endianness JSON, memeriksa empat byte pertama untuk byte NUL:
Sekarang, jika file dimulai dengan BOM itu akan terlihat seperti ini:
Perhatikan bahwa:
Tergantung pada implementasinya, semua itu dapat ditafsirkan secara tidak benar sebagai UTF-8 dan kemudian disalahartikan atau ditolak sebagai UTF-8 yang tidak valid, atau tidak diakui sama sekali.
Selain itu, jika tes implementasi untuk JSON yang valid seperti yang saya sarankan, itu akan menolak bahkan input yang memang dikodekan sebagai UTF-8, karena itu tidak dimulai dengan karakter ASCII <128 seperti yang seharusnya sesuai dengan RFC.
Format data lainnya
BOM di JSON tidak diperlukan, ilegal dan merusak perangkat lunak yang berfungsi dengan benar menurut RFC. Seharusnya menjadi seorang bangsawan untuk tidak menggunakannya saat itu, namun, selalu ada orang yang bersikeras melanggar JSON dengan menggunakan BOM, komentar, aturan kutip yang berbeda atau tipe data yang berbeda. Tentu saja siapa pun bebas menggunakan hal-hal seperti BOM atau apa pun jika Anda membutuhkannya - jangan panggil saja JSON.
Untuk format data lain selain JSON, lihat bagaimana tampilannya. Jika satu-satunya penyandian adalah UTF- * dan karakter pertama haruslah karakter ASCII lebih rendah dari 128, maka Anda sudah memiliki semua informasi yang diperlukan untuk menentukan penyandian dan daya tahan data Anda. Menambahkan BOM bahkan sebagai fitur opsional hanya akan membuatnya lebih rumit dan rentan kesalahan.
Penggunaan BOM lainnya
Adapun penggunaan di luar JSON atau skrip, saya pikir sudah ada jawaban yang sangat bagus di sini. Saya ingin menambahkan info yang lebih rinci secara khusus tentang skrip dan serialisasi, karena ini adalah contoh karakter BOM yang menyebabkan masalah nyata.
sumber
Jawaban singkat: Dalam UTF-8, BOM dikodekan sebagai byte
EF BB BF
pada awal file.Jawaban panjang:
Awalnya, diharapkan Unicode akan dikodekan dalam UTF-16 / UCS-2. BOM dirancang untuk formulir penyandian ini. Ketika Anda memiliki unit kode 2-byte, perlu untuk menunjukkan urutan urutan kedua byte tersebut, dan konvensi umum untuk melakukan ini adalah memasukkan karakter U + FEFF sebagai "Byte Order Mark" di awal data. Karakter U + FFFE secara permanen tidak ditetapkan sehingga keberadaannya dapat digunakan untuk mendeteksi urutan byte yang salah.
UTF-8 memiliki urutan byte yang sama terlepas dari platform endianness, sehingga tanda urutan byte tidak diperlukan. Namun, ini dapat terjadi (sebagai urutan byte
EF BB FF
) dalam data yang dikonversi ke UTF-8 dari UTF-16, atau sebagai "tanda tangan" untuk menunjukkan bahwa data tersebut adalah UTF-8.Tanpa. Ketika Martin Cote menjawab, standar Unicode tidak merekomendasikannya. Ini menyebabkan masalah dengan perangkat lunak yang tidak sadar BOM.
Cara yang lebih baik untuk mendeteksi apakah suatu file adalah UTF-8 adalah dengan melakukan pemeriksaan validitas. UTF-8 memiliki aturan ketat tentang urutan byte apa yang valid, sehingga kemungkinan false positive dapat diabaikan. Jika urutan byte terlihat seperti UTF-8, mungkin itu.
sumber
sh
,perl
,g++
dan banyak alat bebas dan kuat, lainnya. Ingin semuanya bekerja? Beli saja versi MS. MS menciptakan masalah khusus platform, seperti halnya bencana pada rentang \ x80- \ x95 mereka.UTF-8 dengan BOM lebih baik diidentifikasi. Saya telah mencapai kesimpulan ini dengan cara yang sulit. Saya sedang mengerjakan proyek di mana salah satu hasilnya adalah file CSV , termasuk karakter Unicode.
Jika file CSV disimpan tanpa BOM, Excel menganggapnya ANSI dan menunjukkan omong kosong. Setelah Anda menambahkan "EF BB BF" di bagian depan (misalnya, dengan menyimpannya kembali menggunakan Notepad dengan UTF-8; atau Notepad ++ dengan UTF-8 dengan BOM), Excel membukanya dengan baik.
Membebani karakter BOM ke file teks Unicode direkomendasikan oleh RFC 3629: "UTF-8, format transformasi ISO 10646", November 2003 di http://tools.ietf.org/html/rfc3629 (info terakhir ini ditemukan di: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )
sumber
BOM cenderung boom (tidak ada permainan yang dimaksudkan) di suatu tempat, di suatu tempat. Dan ketika booming (misalnya, tidak dikenali oleh browser, editor, dll.), Itu muncul sebagai karakter aneh

di awal dokumen (misalnya, file HTML, respons JSON , RSS , dll.) dan menyebabkan jenis rasa malu seperti masalah pengkodean baru - baru ini dialami selama pembicaraan Obama di Twitter .Ini sangat menjengkelkan ketika muncul di tempat-tempat yang sulit di-debug atau ketika pengujian diabaikan. Jadi yang terbaik adalah menghindarinya kecuali Anda harus menggunakannya.
sumber
Berikut adalah beberapa kutipan dari artikel Wikipedia tentang byte order mark (BOM) yang saya percaya menawarkan jawaban yang kuat untuk pertanyaan ini.
Tentang arti BOM dan UTF-8:
Argumen untuk TIDAK menggunakan BOM:
Argumen UNTUK menggunakan BOM:
Di mana lebih baik, DENGAN atau TANPA BOM:
Kesimpulan saya:
Gunakan BOM hanya jika kompatibilitas dengan aplikasi perangkat lunak sangat penting.
Juga perhatikan bahwa sementara artikel Wikipedia yang direferensikan menunjukkan bahwa banyak aplikasi Microsoft mengandalkan BOM untuk mendeteksi UTF-8 dengan benar, ini tidak berlaku untuk semua aplikasi Microsoft. Misalnya, seperti keluar menunjuk oleh @barlop , ketika menggunakan Windows Command Prompt dengan UTF-8 † , perintah tersebut
type
danmore
tidak mengharapkan BOM untuk hadir. Jika BOM adalah hadir, itu dapat menjadi masalah karena untuk aplikasi lain.†
chcp
Perintah ini menawarkan dukungan untuk UTF-8 ( tanpa BOM) melalui halaman kode 65001 .sumber
.htaccess
dangzip compression
dalam kombinasi dengan UTF-8 BOM memberikan kesalahan pengkodean Ubah ke Pengkodean di UTF-8 tanpa BOM mengikuti saran seperti yang dijelaskan di sini menyelesaikan masalahPertanyaan ini sudah memiliki jutaan jawaban dan banyak dari mereka cukup bagus, tetapi saya ingin mencoba dan mengklarifikasi kapan BOM harus atau tidak boleh digunakan.
Seperti disebutkan, setiap penggunaan UTF BOM (Byte Order Mark) dalam menentukan apakah suatu string adalah UTF-8 atau bukan merupakan tebakan yang dididik. Jika ada metadata yang tepat tersedia (seperti
charset="utf-8"
), maka Anda sudah tahu apa yang seharusnya Anda gunakan, tetapi jika tidak, Anda harus menguji dan membuat beberapa asumsi. Ini melibatkan memeriksa apakah file suatu string berasal dimulai dengan kode byte heksadesimal, EF BB BF.Jika kode byte yang sesuai dengan BOM UTF-8 ditemukan, probabilitasnya cukup tinggi untuk menganggapnya UTF-8 dan Anda dapat pergi dari sana. Namun, ketika dipaksa untuk membuat perkiraan ini, pengecekan kesalahan tambahan saat membaca masih merupakan ide bagus jika ada sesuatu yang kacau. Anda seharusnya hanya menganggap BOM bukan UTF-8 (yaitu latin-1 atau ANSI) jika inputnya tidak boleh UTF-8 berdasarkan sumbernya. Namun, jika tidak ada BOM, Anda bisa menentukan apakah itu seharusnya UTF-8 dengan memvalidasi terhadap penyandian.
Mengapa BOM tidak direkomendasikan?
Kapan sebaiknya Anda menyandikan dengan BOM?
Jika Anda tidak dapat merekam metadata dengan cara lain (melalui tag charset atau sistem file meta), dan program yang digunakan seperti BOM, Anda harus menyandikannya dengan BOM. Ini terutama benar pada Windows di mana segala sesuatu tanpa BOM umumnya dianggap menggunakan halaman kode warisan. BOM memberi tahu program seperti Office bahwa, ya, teks dalam file ini adalah Unicode; inilah pengkodean yang digunakan.
Ketika sampai pada itu, satu-satunya file yang pernah saya benar-benar mengalami masalah adalah CSV. Tergantung pada programnya, ia harus, atau tidak boleh memiliki BOM. Misalnya, jika Anda menggunakan Excel 2007+ di Windows, itu harus dikodekan dengan BOM jika Anda ingin membukanya dengan lancar dan tidak perlu menggunakan impor data.
sumber
Perlu dicatat bahwa untuk beberapa file Anda tidak harus memiliki BOM bahkan pada Windows. Contohnya adalah
SQL*plus
atauVBScript
file. Seandainya file tersebut berisi BOM Anda mendapatkan kesalahan saat Anda mencoba untuk mengeksekusinya.sumber
UTF-8 dengan BOM hanya membantu jika file tersebut sebenarnya mengandung beberapa karakter non-ASCII. Jika disertakan dan tidak ada, maka itu mungkin akan merusak aplikasi yang lebih tua yang seharusnya menafsirkan file tersebut sebagai ASCII biasa. Aplikasi ini pasti akan gagal ketika mereka menemukan karakter non ASCII, jadi menurut saya BOM hanya boleh ditambahkan ketika file dapat, dan seharusnya, tidak lagi ditafsirkan sebagai ASCII biasa.
Saya ingin menjelaskan bahwa saya memilih untuk tidak memiliki BOM sama sekali. Tambahkan jika ada sampah lama rusak tanpa itu, dan mengganti aplikasi warisan tidak layak.
Jangan membuat apa pun mengharapkan BOM untuk UTF-8.
sumber
Dikutip di bagian bawah halaman Wikipedia di BOM: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2
sumber
UTF-8 tanpa BOM tidak memiliki BOM, yang tidak membuatnya lebih baik daripada UTF-8 dengan BOM, kecuali ketika konsumen file perlu tahu (atau akan mendapat manfaat dari mengetahui) apakah file tersebut dikodekan UTF-8. atau tidak.
BOM biasanya berguna untuk menentukan endianness dari pengkodean, yang tidak diperlukan untuk sebagian besar kasus penggunaan.
Juga, BOM dapat menjadi kebisingan / rasa sakit yang tidak perlu bagi konsumen yang tidak tahu atau peduli tentang hal itu, dan dapat menyebabkan kebingungan pengguna.
sumber
Saya melihat ini dari sudut pandang yang berbeda. Saya pikir UTF-8 dengan BOM lebih baik karena memberikan informasi lebih lanjut tentang file tersebut. Saya menggunakan UTF-8 tanpa BOM hanya jika saya menghadapi masalah.
Saya menggunakan banyak bahasa (bahkan Cyrillic ) di halaman saya untuk waktu yang lama dan ketika file disimpan tanpa BOM dan saya buka kembali untuk diedit dengan editor (seperti cherouvim dicatat oleh ), beberapa karakter rusak.
Perhatikan bahwa Notepad klasik Windows secara otomatis menyimpan file dengan BOM ketika Anda mencoba menyimpan file yang baru dibuat dengan pengkodean UTF-8.
Saya pribadi menyimpan file skrip sisi server (.asp, .ini, .aspx) dengan file BOM dan .html tanpa BOM .
sumber
chcp 65001
untuk dukungan utf8, itu utf8 tanpa bom. Jika Anda melakukannyatype myfile
hanya akan ditampilkan dengan benar jika tidak ada bom. Jika Anda melakukanecho aaa>a.a
atauecho אאא>a.a
untuk mengeluarkan karakter ke file aa, dan Anda memiliki chcp 65001, itu akan dihasilkan tanpa BOM.Saat Anda ingin menampilkan informasi yang dikodekan dalam UTF-8 Anda mungkin tidak menghadapi masalah. Deklarasikan misalnya dokumen HTML sebagai UTF-8 dan Anda akan memiliki semua yang ditampilkan di browser Anda yang terkandung dalam badan dokumen.
Tapi ini tidak terjadi ketika kita memiliki teks, CSV file dan XML, baik di Windows atau Linux.
Misalnya, file teks di Windows atau Linux, salah satu hal termudah yang bisa dibayangkan, itu bukan (biasanya) UTF-8.
Simpan sebagai XML dan nyatakan sebagai UTF-8:
Itu tidak akan ditampilkan (tidak akan dibaca) dengan benar, bahkan jika itu dinyatakan sebagai UTF-8.
Saya memiliki serangkaian data yang berisi surat-surat Prancis, yang perlu disimpan sebagai XML untuk sindikasi. Tanpa membuat file UTF-8 dari awal (mengubah opsi di IDE dan "Buat File Baru") atau menambahkan BOM di awal file
Saya tidak dapat menyimpan huruf Prancis dalam file XML.
sumber
Satu perbedaan praktis adalah bahwa jika Anda menulis skrip shell untuk Mac OS X dan menyimpannya sebagai UTF-8, Anda akan mendapatkan respons:
sebagai tanggapan terhadap garis shebang yang menentukan shell mana yang ingin Anda gunakan:
Jika Anda menyimpan sebagai UTF-8, tidak ada BOM (katakanlah di BBEdit ) semua akan baik-baik saja.
sumber
Seperti disebutkan di atas, UTF-8 dengan BOM dapat menyebabkan masalah dengan perangkat lunak yang tidak sadar BOM (atau kompatibel). Saya pernah mengedit file HTML yang dikodekan sebagai UTF-8 + BOM dengan KompoZer berbasis Mozilla , sebagai klien mengharuskan WYSIWYG program .
Tata letak akan hancur saat menyimpan. Butuh beberapa waktu untuk bermain-main dengan ini. File-file ini kemudian bekerja dengan baik di Firefox, tetapi menunjukkan kekhasan CSS di Internet Explorer, menghancurkan tata letak, lagi. Setelah mengutak-atik file CSS yang terhubung selama berjam-jam tidak berhasil saya menemukan bahwa Internet Explorer tidak menyukai file HTML BOMfed. Tidak akan lagi.
Juga, saya baru saja menemukan ini di Wikipedia:
sumber
FAQ Unicode Byte Order Mark (BOM) memberikan jawaban singkat:
sumber
Dari http://en.wikipedia.org/wiki/Byte-order_mark :
Selalu menggunakan BOM dalam file Anda akan memastikan bahwa selalu terbuka dengan benar di editor yang mendukung UTF-8 dan BOM.
Masalah sebenarnya saya dengan tidak adanya BOM adalah sebagai berikut. Misalkan kita punya file yang berisi:
Tanpa BOM ini terbuka sebagai ANSI di sebagian besar editor. Jadi pengguna lain dari file ini membukanya dan menambahkan beberapa karakter asli, misalnya:
Ups ... Sekarang file tersebut masih dalam ANSI dan coba tebak, "αβγ" tidak menempati 6 byte, tetapi 3. Ini bukan UTF-8 dan ini menyebabkan masalah lain di rantai pengembangan selanjutnya.
sumber
Berikut adalah pengalaman saya dengan permintaan tarik Visual Studio, Sourcetree dan Bitbucket, yang telah memberi saya beberapa masalah:
Jadi ternyata BOM dengan tanda tangan akan menyertakan karakter titik merah pada setiap file ketika meninjau permintaan tarik (itu bisa sangat menjengkelkan).
Jika Anda mengarahkannya, itu akan menampilkan karakter seperti "ufeff", tetapi ternyata Sourcetree tidak menunjukkan jenis bytemark ini, sehingga kemungkinan besar akan berakhir pada permintaan tarik Anda, yang seharusnya baik karena itulah bagaimana Visual Studio 2017 mengkodekan file baru sekarang, jadi mungkin Bitbucket harus mengabaikan ini atau membuatnya tampil dengan cara lain, info lebih lanjut di sini:
Penanda titik merah tampilan diff BitBucket
sumber
UTF dengan BOM lebih baik jika Anda menggunakan UTF-8 dalam file HTML dan jika Anda menggunakan Bahasa Serbia, Bahasa Latin Serbia, Bahasa Jerman, Bahasa Hongaria atau bahasa eksotik pada halaman yang sama.
Itulah pendapat saya (30 tahun industri komputasi dan TI).
sumber