Mengapa Windows 7 bekerja dengan Unicode dan tidak dengan UTF-8?
Terminologi
Unicode dan UTF-8 bukanlah hal yang sama: Unicode adalah rangkaian karakter yang mendefinisikan sekumpulan karakter (repertoar) dan menetapkan angka (titik kode) untuk masing-masing karakter tersebut. UTF ‑ 8 adalah salah satu dari beberapa penyandian yang dapat digunakan untuk mewakili aliran karakter Unicode pada disk atau dalam transmisi. Aliran karakter Unicode yang sama juga dapat dikodekan sebagai UTF ‑ 16, UTF ‐ 32 atau UTF ‑ 7, misalnya.
Namun, Notepad penawaran Anda "encoding" pilihan termasuk ANSI
, Unicode
, Unicode big-endian
dan UTF-8
. Pengembang Microsoft yang menulis ini menggunakan istilah yang salah. Ketika mereka mengatakan "Unicode" mereka kemungkinan besar berarti " UTF-16
little-endian ". Ketika mereka mengatakan "ANSI" yang mereka maksud adalah Kode 1252 (CP-1252).
Microsoft Notepad
Saya percaya Microsoft Notepad menulis UTF-16 dengan tanda urutan byte ( BOM ) dan Notepad mencari BOM saat membaca file teks. BOM memberi tahu aplikasi bahwa file tersebut adalah UTF-16 dan menunjukkan apakah itu big-endian atau little-endian.
Jika Notepad tidak menemukan BOM, ia memanggil fungsi pustaka IsTextUnicode
, yang melihat data dan mencoba menebak encoding apa yang digunakan. Terkadang (tak terhindarkan) tebakannya salah. Terkadang ia menduga bahwa file "ANSI" adalah "Unicode". Mencoba menafsirkan file UTF-16 atau UTF-8 sebagai Kode Halaman 1252 akan menyebabkannya menampilkan mesin terbang yang salah dan tidak dapat menemukan mesin terbang untuk membuat beberapa nilai 8-bit - ini kemudian akan ditampilkan sebagai kotak.
Seperti yang dikatakan harrymc dalam jawabannya , ada alternatif yang lebih baik untuk Notepad. Tapi Notepad memungkinkan Anda memilih penyandian saat membuka file (daripada meninggalkan Notepad untuk mencoba menebak).
Tanda Pesanan Byte
Menurut konsorsium Unicode, Byte Order Marks (BOMs) adalah opsional. Namun, Windows mengandalkan BOM untuk membedakan antara beberapa pengkodean.
Jadi singkatnya, mungkin file Anda tidak memiliki BOM karena suatu alasan? Mungkin BOM hilang kapan saja selama proses peningkatan?
Jika Anda masih memiliki file asli yang ditampilkan sebagai kuadrat, Anda bisa membuat hex dump untuk melihat apakah file tersebut mengandung BOM.
Standar file teks biasa
Masalahnya adalah bahwa ada secara efektif tidak ada - ada standar universal untuk file teks biasa. Sebaliknya, kami memiliki sejumlah ketidakcocokan dan tidak diketahui.
Bagaimana akhir baris ditandai? Beberapa platform menggunakan kontrol-karakter Carriage Return (CR) diikuti oleh Line Feed (LF), beberapa menggunakan CR saja dan beberapa menggunakan LF saja.
Apakah terminator atau pemisah di atas? Ini memiliki efek di akhir file dan diketahui menyebabkan masalah.
Perawatan tab dan karakter kontrol lainnya. Kita mungkin berasumsi bahwa tab digunakan untuk menyelaraskan ke kelipatan 8 lebar karakter standar dari awal baris, tetapi sebenarnya tidak ada kepastian untuk ini. Banyak program yang memungkinkan posisi tab diubah.
Kumpulan karakter & Pengkodean? Tidak ada standar universal untuk menunjukkan yang mana dari ini telah digunakan untuk teks dalam file. Yang terdekat dengan yang kami miliki adalah mencari keberadaan BOM yang menunjukkan bahwa pengkodean adalah salah satu yang digunakan untuk Unicode. Dari nilai BOM, program yang membaca file dapat membedakan antara UTF-8 dan UTF-16, dll., Dan antara varian Little-Endian dan Big-Endian dari UTF-16, dll. Tidak ada standar universal untuk menunjukkan bahwa suatu file dikodekan dalam pengkodean populer lainnya seperti CP-1252 atau KOI-8.
Dan seterusnya. Tidak satu pun dari metadata di atas yang ditulis ke dalam file teks - sehingga pengguna akhir harus memberi tahu program ketika membaca file tersebut. Pengguna akhir harus mengetahui nilai metadata untuk file tertentu atau menjalankan risiko bahwa program mereka akan menggunakan nilai metadata yang salah.
Bush menyembunyikan fakta
Coba ini di Windows XP.
- Buka Notepad.
- Atur font ke Arial Unicode MS. (Anda mungkin perlu menginstalnya terlebih dahulu; jika Anda tidak melihatnya di menu, klik "Tampilkan lebih banyak font".)
- Masukkan teks "Bush sembunyikan fakta".
- Pilih
Save As
. Dari Encoding
menu, pilih ANSI
.
- Tutup Notepad.
- Buka kembali dokumen (mis. Menggunakan
Start
, My Recent Documents
).
- Anda akan melihat 畂 桳 栠 摩 琠 敨 映 捡 獴 bukannya "Bush menyembunyikan fakta".
Ini menggambarkan bahwa IsTextUnicode
fungsi yang digunakan oleh Notepad salah menebak bahwa teks ANSI (benar-benar Kode Page 1252) adalah Unicode UTF-16LE tanpa BOM. Tidak ada BOM dalam file yang disimpan sebagai ANSI
.
Windows 7
Dengan Windows 7, Microsoft menyesuaikan IsTextUnicode
agar hal di atas tidak terjadi. Dengan tidak adanya BOM, sekarang lebih mungkin untuk menebak ANSI (CP 1252) daripada Unicode (UTF-16LE). Dengan Windows-7 saya berharap Anda karena itu lebih cenderung memiliki masalah sebaliknya: File yang berisi karakter Unicode dengan poin kode lebih besar dari 255, tetapi tanpa BOM, sekarang lebih mungkin untuk ditebak sebagai ANSI - dan karenanya ditampilkan secara tidak benar.
Mencegah masalah pengkodean
Saat ini, pendekatan terbaik tampaknya menggunakan UTF-8 di mana-mana. Idealnya Anda akan menyandikan ulang semua file teks lama menjadi UTF-8 dan hanya akan pernah menyimpan file teks sebagai UTF-8. Ada alat seperti recode dan iconv yang dapat membantu dengan ini.