UTF-8: Unicode TransformationFormat-8bit, BOM diperbolehkan, tetapi BOM biasanya tidak disertakan. Ini adalah pengkodean multi-byte yang digunakan untuk menyelesaikan karakter internasional. Ia menggunakan 8 bit (yaitu, satu byte) untuk bahasa Inggris dan 24 bit (tiga byte) untuk bahasa Cina. UTF-8 berisi karakter yang digunakan oleh semua negara di dunia. Ini merupakan pengkodean internasional dan memiliki fleksibilitas yang kuat. Teks berkode UTF-8 dapat ditampilkan di browser di berbagai negara yang mendukung rangkaian karakter UTF8. Misalnya, jika pengkodeannya UTF8, bahasa Mandarin juga dapat ditampilkan di IE bahasa Inggris orang asing, dan mereka tidak perlu mengunduh paket dukungan bahasa Mandarin IE.
GBK adalah standar yang didasarkan pada standar nasional GB2312 dan diperluas agar kompatibel dengan GB2312. Pengkodean teks GBK diwakili oleh byte ganda, yaitu karakter Cina dan Inggris diwakili oleh byte ganda. Untuk membedakan karakter Cina, bit tertinggi disetel ke 1. GBK berisi semua karakter Cina dan merupakan pengkodean nasional. Ini kurang serbaguna dibandingkan UTF8, tetapi UTF8 menempati database yang lebih besar daripada GBD.
GBK, GB2312, dll. harus dikonversi ke UTF8 melalui pengkodean Unicode:
GBK, GB2312--Unicode--UTF8
UTF8--Unicode--GBK, GB2312
Untuk website atau forum, jika banyak karakter bahasa Inggris, disarankan menggunakan UTF-8 untuk menghemat ruang. Namun, banyak plugin forum sekarang yang umumnya hanya mendukung GBK.
Penjelasan mendetail tentang perbedaan antara pengkodean. Sederhananya, kode unicode, gbk, dan lima besar adalah nilai yang dikodekan, dan utf-8, uft-16, dan sejenisnya adalah ekspresi dari nilai ini. Tiga kode sebelumnya kompatibel. Untuk karakter Cina yang sama, ketiga nilai kode tersebut sangat berbeda. Misalnya, nilai uncode "Han" berbeda dengan gbk. Misalkan uncode adalah a040 dan gbk adalah b030, dan kode uft-8 adalah bentuk ekspresi nilai tersebut. Kode utf-8 diatur sepenuhnya hanya untuk uncode. Jika GBK ingin diubah menjadi UTF-8, harus diubah menjadi uncode terlebih dahulu, lalu diubah menjadi utf-8 dan OK.
Untuk lebih jelasnya, lihat artikel yang dicetak ulang di bawah ini.
Mari kita bicara tentang pengkodean Unicode dan jelaskan secara singkat istilah-istilah seperti UCS, UTF, BMP, dan BOM. Ini adalah bacaan menarik yang ditulis oleh programmer untuk programmer. Yang disebut kesenangan berarti Anda dapat dengan mudah memahami beberapa konsep yang sebelumnya tidak jelas dan meningkatkan pengetahuan Anda, yang mirip dengan peningkatan dalam game RPG. Motivasi penyusunan artikel ini adalah dua pertanyaan:
Pertanyaan pertama:
Menggunakan "Simpan Sebagai" di Windows Notepad, Anda dapat mengkonversi antara metode pengkodean GBK, Unicode, Unicode big endian dan UTF-8. Atau Anda dapat langsung mengunjungi http://www.knowsky.com/tools/utf8.asp untuk konversi online.
Ini juga merupakan file txt. Bagaimana cara Windows mengidentifikasi metode pengkodean?
Saya sudah lama mengetahui bahwa file txt yang disandikan Unicode, Unicode bigendian, dan UTF-8 akan memiliki beberapa byte lagi di awal, yaitu FF, FE (Unicode), FE, FF (Unicode bigendian), EF, BB, BF (UTF-8). Namun kriteria apa yang menjadi dasar penanda ini?
Pertanyaan kedua:
Baru-baru ini saya melihat ConvertUTF.c di Internet, yang mewujudkan konversi timbal balik UTF-32, UTF-16 dan UTF-8. Saya sudah mengetahui tentang metode pengkodean seperti Unicode (UCS2), GBK, dan UTF-8. Namun program ini membuat saya sedikit bingung, dan saya tidak ingat apa hubungan antara UTF-16 dan UCS2.
Setelah memeriksa informasi yang relevan, saya akhirnya mengklarifikasi masalah ini, dan juga mempelajari beberapa detail tentang Unicode. Tulis artikel dan kirimkan ke teman yang memiliki pertanyaan serupa. Artikel ini ditulis semudah mungkin untuk dipahami, namun pembaca wajib mengetahui apa itu byte dan apa itu heksadesimal.
0. endian besar dan endian kecil
big endian dan little endian adalah cara CPU menangani angka multibyte yang berbeda. Misalnya, pengkodean Unicode untuk karakter "汉" adalah 6C49. Jadi saat menulis ke file, apakah 6C harus ditulis di depan atau 49 ditulis di depan? Jika 6C ditulis di depan, itu adalah big endian. Jika 49 ditulis di depan, itu adalah little endian.
Kata "endian" berasal dari "Gulliver's Travels". Perang saudara di Lilliput disebabkan oleh apakah akan memecahkan telur dari Big-Endian atau Little-Endian. Akibatnya, terjadi enam pemberontakan. Satu kaisar kehilangan nyawanya, dan satu lagi kehilangan takhta.
Kami biasanya menerjemahkan endian sebagai "urutan byte", dan endian besar serta endian kecil disebut "akhir besar" dan "akhir kecil".
1. Pengkodean karakter dan kode internal. Omong-omong, karakter pengkodean karakter Cina harus dikodekan sebelum dapat diproses oleh komputer. Metode pengkodean default yang digunakan oleh komputer adalah kode internal komputer. Komputer awal menggunakan pengkodean ASCII 7-bit untuk memproses karakter bahasa Mandarin, pemrogram merancang GB2312 untuk bahasa Mandarin Sederhana dan big5 untuk bahasa Mandarin Tradisional.
RFC2781 dan RFC3629 IETF menjelaskan metode pengkodean UTF-16 dan UTF-8 dengan jelas, tajam dan teliti dalam gaya RFC yang konsisten. Saya selalu lupa bahwa IETF adalah singkatan dari Internet Engineering Task Force. Namun, RFC yang dikelola oleh IETF adalah dasar dari semua spesifikasi di Internet.
2.1. Kode internal dan halaman kode
Saat ini kernel Windows sudah mendukung character set Unicode, sehingga kernel tersebut dapat mendukung semua bahasa di dunia. Namun karena banyak program dan dokumen yang ada menggunakan pengkodean bahasa tertentu, seperti GBK, tidak mungkin Windows tidak mendukung pengkodean yang ada dan semuanya menggunakan Unicode.
Windows menggunakan halaman kode untuk beradaptasi dengan berbagai negara dan wilayah. Halaman kode dapat dipahami sebagai kode internal yang disebutkan sebelumnya. Halaman kode yang sesuai dengan GBK adalah CP936.
Microsoft juga mendefinisikan halaman kode untuk GB18030: CP54936. Namun, karena GB18030 memiliki beberapa pengkodean 4-byte, dan halaman kode Windows hanya mendukung pengkodean byte tunggal dan ganda, halaman kode ini tidak dapat digunakan.
3. UCS-2, UCS-4, BMP
UCS hadir dalam dua format: UCS-2 dan UCS-4. Seperti namanya, UCS-2 dikodekan dengan dua byte, dan UCS-4 dikodekan dengan 4 byte (sebenarnya yang digunakan hanya 31 bit, bit tertinggi harus 0). Mari kita lakukan beberapa permainan matematika sederhana:
UCS-2 memiliki 2^16=65536 titik kode, dan UCS-4 memiliki 2^31=2147483648 titik kode.
UCS-4 dibagi menjadi 2^7=128 grup menurut byte tertinggi dengan bit tertinggi adalah 0. Setiap grup dibagi menjadi 256 bidang berdasarkan byte tertinggi berikutnya. Setiap bidang dibagi menjadi 256 baris menurut byte ketiga, dan setiap baris berisi 256 sel. Tentu saja, sel-sel di baris yang sama hanya berbeda pada byte terakhir, dan sisanya sama.
Bidang 0 dari grup 0 disebut Bidang Multibahasa Dasar, atau BMP. Atau di UCS-4, bit kode dengan dua byte teratas adalah 0 disebut BMP.
UCS-2 diperoleh dengan menghapus dua byte nol pertama dari BMP UCS-4. Tambahkan dua byte nol di depan dua byte UCS-2 untuk mendapatkan BMP UCS-4. Tidak ada karakter yang dialokasikan di luar BMP dalam spesifikasi UCS-4 saat ini.
4. Pengkodean UTF
UTF-8 mengkodekan UCS dalam unit 8-bit. Pengkodean dari UCS-2 ke UTF-8 adalah sebagai berikut:
Pengkodean UCS-2 (heksadesimal) Aliran byte UTF-8 (biner)
0000-007F 0xxxxxxx
0080-07FF 110xxxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
Misalnya, pengkodean Unicode "Cina" adalah 6C49. 6C49 berada di antara 0800-FFFF, jadi Anda harus menggunakan templat 3-byte: 1110xxxx 10xxxxxx10xxxxxx. Penulisan 6C49 dalam biner adalah: 0110 110001 001001. Menggunakan aliran bit ini untuk menggantikan x pada template secara bergantian, kita mendapatkan: 1110011010110001 10001001, yaitu E6 B1 89.
Pembaca dapat menggunakan Notepad untuk menguji apakah pengkodean kita sudah benar. Perlu dicatat bahwa UltraEdit akan secara otomatis mengonversi ke UTF-16 saat membuka file teks berkode UTF-8, yang dapat menyebabkan kebingungan. Anda dapat menonaktifkan opsi ini di pengaturan. Alat yang lebih baik adalah Hex Workshop.
UTF-16 mengkodekan UCS dalam unit 16-bit. Untuk kode UCS kurang dari 0x10000, pengkodean UTF-16 sama dengan bilangan bulat 16-bit unsigned yang sesuai dengan kode UCS. Untuk kode UCS tidak kurang dari 0x10000, suatu algoritma ditentukan. Namun, karena BMP dari UCS2 atau UCS4 yang sebenarnya digunakan harus kurang dari 0x10000, untuk saat ini, UTF-16 dan UCS-2 pada dasarnya dapat dianggap sama. Namun, UCS-2 hanyalah skema pengkodean, dan UTF-16 digunakan untuk transmisi sebenarnya, jadi masalah urutan byte harus dipertimbangkan.
5. Urutan byte UTF dan BOM
UTF-8 menggunakan byte sebagai unit pengkodean dan tidak memiliki masalah endianness. UTF-16 menggunakan dua byte sebagai unit pengkodean. Sebelum menafsirkan teks UTF-16, Anda harus terlebih dahulu memahami urutan byte setiap unit pengkodean. Misalnya, pengkodean Unicode untuk "Kui" adalah 594E, dan pengkodean Unicode untuk "B" adalah 4E59. Jika kita menerima aliran UTF-16 byte "594E", apakah ini "Ku" atau "B"?
Metode yang disarankan untuk menandai urutan byte dalam spesifikasi Unicode adalah BOM. BOM bukanlah daftar BOM "Bill Of Material", melainkan Byte order Mark. BOM adalah ide yang sedikit cerdas:
Ada karakter bernama "ZERO WIDTH NO-BREAKSPACE" dalam pengkodean UCS, dan pengkodeannya adalah FEFF. FFFE adalah karakter yang tidak ada di UCS, jadi seharusnya tidak muncul di transmisi sebenarnya. Spesifikasi UCS merekomendasikan agar kami mengirimkan karakter "ZERO WIDTH NO-BREAK SPACE" sebelum mengirimkan aliran byte.
Dengan cara ini, jika penerima menerima FEFF, ini menunjukkan bahwa aliran byte adalah Big-Endian; jika menerima FFFE, ini menunjukkan bahwa aliran byte adalah Little-Endian. Oleh karena itu karakter "ZERO WIDTH NO-BREAK SPACE" disebut juga BOM.
UTF-8 tidak memerlukan BOM untuk menunjukkan urutan byte, tetapi dapat menggunakan BOM untuk menunjukkan metode pengkodean. Pengkodean UTF-8 untuk karakter "ZERO WIDTH NO-BREAKSPACE" adalah EF BB BF (pembaca dapat memverifikasinya menggunakan metode pengkodean yang kami perkenalkan sebelumnya). Jadi jika penerima menerima aliran byte yang dimulai dengan EF BBBF, ia mengetahui bahwa itu dikodekan UTF-8.
Windows menggunakan BOM untuk menandai pengkodean file teks.
6. Bahan referensi lebih lanjut Bahan referensi utama untuk artikel ini adalah "Ikhtisar Singkat ISO-IEC 10646 dan Unicode" ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
Saya juga menemukan dua informasi yang kelihatannya bagus, tetapi karena saya sudah mempunyai jawaban atas pertanyaan awal saya, saya tidak membacanya:
"Memahami Unicode Pengantar umum tentang Standar Unicode" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
"Dasar-dasar pengkodean kumpulan karakter Memahami pengkodean kumpulan karakter dan pengkodean lama" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
Saya telah menulis paket perangkat lunak untuk mengonversi UTF-8, UCS-2, dan GBK ke dan dari satu sama lain, termasuk versi yang menggunakan Windows API dan versi yang tidak menggunakan Windows API. Jika saya punya waktu di masa depan, saya akan memilahnya dan menaruhnya di beranda pribadi saya ( http://fmddlmyy.home4u.china.com ).
Saya mulai menulis artikel ini setelah memikirkan semua masalahnya. Saya pikir saya bisa menyelesaikannya dalam beberapa saat. Tanpa diduga, butuh waktu lama untuk mempertimbangkan kata-katanya dan memeriksa detailnya, dan saya menulisnya dari jam 1:30 hingga 9:00 sore. Semoga beberapa pembaca dapat mengambil manfaat darinya.
Lampiran 1 Mari kita bahas tentang kode lokasi, GB2312, kode internal dan halaman kode. Beberapa teman masih memiliki pertanyaan tentang kalimat ini di artikel:
"Teks asli GB2312 masih berupa kode area. Dari kode area hingga kode dalam, Anda perlu menambahkan A0 masing-masing ke byte tinggi dan byte rendah."
Izinkan saya menjelaskannya secara detail:
"Teks asli GB2312" mengacu pada standar nasional tahun 1980, "Kumpulan Dasar Kumpulan Karakter Berkode Tiongkok untuk Pertukaran Informasi Standar Nasional Republik Rakyat Tiongkok GB2312-80". Standar ini menggunakan dua angka untuk mengkodekan karakter Cina dan simbol Cina. Angka pertama disebut “area” dan angka kedua disebut “bit”. Jadi disebut juga kode lokasi. Area 1-9 adalah simbol Cina, area 16-55 adalah karakter Cina tingkat pertama, dan area 56-87 adalah karakter Cina tingkat kedua. Sekarang Windows juga memiliki metode input lokasi, misalnya input 1601 untuk mendapatkan "ah". (Metode input lokasi ini dapat secara otomatis mengenali kode lokasi heksadesimal GB2312 dan desimal, yang berarti memasukkan B0A1 juga akan mendapatkan "ah".)
Kode internal mengacu pada pengkodean karakter dalam sistem operasi. Kode internal sistem operasi awal bergantung pada bahasa. Windows saat ini mendukung Unicode dalam sistem, dan kemudian menggunakan halaman kode untuk beradaptasi dengan berbagai bahasa. Konsep "kode internal" relatif tidak jelas. Microsoft umumnya merujuk pada pengkodean yang ditentukan oleh halaman kode default sebagai kode internal.
Tidak ada definisi resmi dari istilah kode internal, dan halaman kode hanyalah nama perusahaan Microsoft. Sebagai programmer, selama kita mengetahui apa itu istilah-istilah tersebut, tidak perlu terlalu mendalami istilah-istilah tersebut.
Yang disebut halaman kode (code page) adalah pengkodean karakter suatu bahasa. Misalnya halaman kode GBK adalah CP936, halaman kode BIG5 adalah CP950, dan halaman kode GB2312 adalah CP20936.
Windows memiliki konsep halaman kode default, yaitu pengkodean apa yang digunakan secara default untuk menafsirkan karakter. Misalnya, Windows Notepad membuka file teks, dan konten di dalamnya adalah aliran byte: BA, BA, D7, D6. Bagaimana seharusnya Windows menafsirkannya?
Haruskah ditafsirkan sesuai dengan pengkodean Unicode, GBK, BIG5, atau ISO8859-1? Jika diartikan menurut GBK maka akan didapat kata “karakter Cina”. Menurut interpretasi pengkodean lainnya, karakter yang sesuai mungkin tidak ditemukan, atau karakter yang salah mungkin ditemukan. Yang disebut "kesalahan" berarti tidak sesuai dengan maksud asli penulis teks, dan karakter yang dihasilkan kacau.
Jawabannya adalah Windows menafsirkan aliran byte dalam file teks sesuai dengan halaman kode default saat ini. Halaman kode default dapat diatur melalui Opsi Regional di Panel Kontrol. Ada item ANSI di Save As Notepad, yang sebenarnya disimpan sesuai dengan metode pengkodean halaman kode default.
Kode internal Windows adalah Unicode, yang secara teknis dapat mendukung beberapa halaman kode secara bersamaan. Selama file tersebut dapat menjelaskan pengkodean apa yang digunakannya dan pengguna telah menginstal halaman kode yang sesuai, Windows dapat menampilkannya dengan benar. Misalnya, rangkaian karakter dapat ditentukan dalam file HTML.
Beberapa penulis file HTML, terutama penulis bahasa Inggris, percaya bahwa semua orang di dunia menggunakan bahasa Inggris dan tidak menentukan rangkaian karakter dalam file. Jika dia menggunakan karakter antara 0x80-0xff, dan Windows Cina menafsirkannya sesuai dengan GBK default, karakter kacau akan muncul. Saat ini, tambahkan saja pernyataan yang menentukan rangkaian karakter ke file html, misalnya:
<meta http-equiv="Jenis Konten" content="teks/html; charset=ISO8859-1">
Jika halaman kode yang digunakan oleh penulis asli kompatibel dengan ISO8859-1, tidak akan ada karakter yang kacau.
Mari kita bicara tentang kode lokasi. Kode lokasi Ah adalah 1601, yaitu 0x10, 0x01 dalam heksadesimal. Hal ini bertentangan dengan pengkodean ASCII yang banyak digunakan oleh komputer. Agar kompatibel dengan pengkodean ASCII 00-7f, kami menambahkan A0 ke byte tinggi dan rendah masing-masing kode area. Dengan cara ini, kode "ah" menjadi B0A1. Kami juga menyebut pengkodean dengan dua A0 yang ditambahkan sebagai pengkodean GB2312, meskipun teks asli GB2312 tidak menyebutkan hal ini sama sekali.