Windows 7 UTF-8 dan Unicode

14

Bisakah seseorang tolong jelaskan apa yang telah berubah di Windows 7 (Pro 64-bit)?

Detail: Sebelumnya saya punya Windows XP dan memiliki beberapa file terjemahan (disandi UTF-8) dalam format CSV. Saya dapat melihat font di Notepad dan Excel. Setelah memutakhirkan ke Windows 7, ketika saya membuka file-file ini - semua yang saya lihat adalah kotak persegi (hanya Anda tahu, jika saya membukanya di browser - saya dapat melihat semua terjemahan). Jika saya menyimpan file-file itu di Unicode, semuanya tampak baik-baik saja.

Jadi, apa yang sebenarnya terjadi? Mengapa Windows 7 bekerja dengan Unicode dan tidak dengan UTF-8?

Sha Le
sumber

Jawaban:

30

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-endiandan 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 Encodingmenu, pilih ANSI.
  • Tutup Notepad.
  • Buka kembali dokumen (mis. Menggunakan Start, My Recent Documents).
  • Anda akan melihat 畂 桳 栠 摩 琠 敨 映 捡 獴 bukannya "Bush menyembunyikan fakta".

Ini menggambarkan bahwa IsTextUnicodefungsi 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 IsTextUnicodeagar 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.

RedGrittyBrick
sumber
3
Menurut Wikipedia : pada Windows Vista dan Windows 7 [..] IsTextUnicode telah diubah untuk membuatnya lebih mungkin untuk menebak pengkodean berbasis byte daripada UTF-16LE.
Arjan
Ya, pastinya file-file tersebut memiliki BOM karena kami membuat file tersebut dengan BOM. Sangat menarik bahwa Windows 7 tidak membaca BOM yang dibuat oleh OS lama.
Sha Le
BOM belum berubah. Mungkin saja file Anda hilang dari BOM, tetapi sebelumnya format defaultnya adalah beberapa varian Unicode, yang sekarang menjadi ASCII. Lihat jawaban saya.
harrymc
@Sha Le: Jika file memiliki BOM, Windows 7 Notepad harus membukanya dengan benar, sehingga masalah yang Anda jelaskan tidak sesuai dengan masalah yang diketahui isTextUnicode. Bisakah Anda membuat file sampel kecil yang menggambarkan masalah yang Anda miliki dengan file yang menyertakan BOM?
RedGrittyBrick
Ada juga this app can breakuntuk efek yang sama sepertiBush hid the facts
Bupati
3

Komentar: Anda dapat menggunakan Notepad ++ untuk melihat file tesis ini, menggunakan menu Pengkodean.

Setelah file ditampilkan dengan benar, menyimpannya akan menambah BOM yang benar.

harrymc
sumber
Saya tahu posting ini agak lama, tetapi saya saat ini memiliki masalah dengan win 7 dan notepad ++ tidak menampilkan UTF 8 tanpa BOM ketika file awalnya dibuat menggunakan notepad ++ v5.9.6.2 itu sendiri.
Jake
@ Jake: Pastikan menu Encoding menunjukkan "Encode in UTF8", dan bukannya "Encode in UTF8 without BOM".
harrymc
1

Di Windows 10 dimungkinkan (uji coba pada build 1903)

  1. Salin file Anda dengan penyandian yang bagus TXTUTF-8.txtke C:\WINDOWS\SHELLNEW.
  2. Dalam HKEY_CLASSES_ROOT\.txt\ShellNewmembuat rantai baru dengan nama " FileName"
  3. Ubah nilai " FileName" menjadi " TXTUTF-8.txt"

Sekarang ketika Anda membuat file txt baru menggunakan menu Windows, itu akan mengambil TXTUTF-8.txttemplat Anda

Sumber: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

e2dy Dev
sumber