Set Karakter Javascript:
Program JavaScript ditulis menggunakan set karakter Unicode. Unicode adalah superset ASCII dan Latin-1 dan mendukung hampir semua bahasa di Bumi. ECMascript3 membutuhkan JavaScript untuk mendukung Unicode 2.1 dan versi selanjutnya, sementara ECMASCRIPT5 membutuhkan dukungan Unicode 3 dan versi selanjutnya. Jadi, kami menulisnya
Program JavaScript semuanya dikodekan menggunakan Unicode.
UTF-8
UTF-8 (format transformasi unicode UTF8-bit) adalah pengkodean karakter panjang variabel untuk unicode dan juga merupakan kode awalan.
Ini dapat digunakan untuk mewakili karakter apa pun dalam standar Unicode, dan byte pertama dalam pengkodeannya masih kompatibel dengan ASCII, yang memungkinkan perangkat lunak yang awalnya menangani karakter ASCII untuk terus digunakan tanpa atau memerlukan sedikit modifikasi. Oleh karena itu, secara bertahap menjadi penyandian yang disukai dalam email, halaman web, dan aplikasi lain untuk menyimpan atau mengirim teks.
Sebagian besar situs web saat ini menggunakan pengkodean UTF-8.
Konversi string yang dikodekan unicode yang dihasilkan oleh JavaScript ke string yang dikodekan UTF-8
Seperti disebutkan dalam judul, skenario aplikasi sangat umum. Misalnya, saat mengirim biner ke server, server menetapkan bahwa pengkodean konten biner harus UTF-8. Dalam hal ini, kita harus mengubah string unicode JavaScript menjadi string yang dikodekan UTF-8 melalui program.
Metode konversi
Sebelum konversi, kita harus memahami bahwa struktur pengkodean Unicode diperbaiki.
Jika Anda tidak mempercayainya, Anda dapat mencoba metode charcodeat dari string untuk melihat berapa banyak byte charcode yang dikembalikan.
• Bahasa Inggris menempati 1 karakter dan karakter Cina menempati 2 karakter
Namun, panjang struktur pengkodean UTF-8 ditentukan oleh ukuran satu karakter.
Di bawah ini adalah ukuran satu karakter yang memakan beberapa byte. Panjang maksimum setelah satu karakter unicode adalah 6 byte.
• 1 byte: kode unicode adalah 0 - 127
• 2 byte: kode unicode adalah 128 - 2047
• 3 byte: kode unicode adalah 2048 - 0xffff
• 4 byte: kode unicode adalah 65536 - 0x1fffff
• 5 byte: kode unicode adalah 0x200000 - 0x3ffffff
• 6 byte: kode unicode adalah 0x4000000 - 0x7fffffff
Untuk detailnya, silakan lihat gambarnya:
Karena kode unicode dari karakter bahasa Inggris dan bahasa Inggris adalah 0 - 127, panjang dan byte bahasa Inggris dalam Unicode dan UTF -8 adalah sama, dan hanya menempati 1 byte. Inilah sebabnya mengapa UTF8 adalah superset dari Unicode!
Sekarang mari kita bahas karakter Cina, karena interval kode unicode dari karakter Cina adalah 0x2e80 - 0x9fff, sehingga panjang karakter Cina di UTF8 hingga 3 byte.
Jadi bagaimana karakter Cina mengonversi dari 2 byte unicode menjadi tiga byte utf8?
Misalkan saya perlu mengubah karakter Cina "中" menjadi pengkodean UTF-8
1. Dapatkan ukuran nilai unicode karakter Cina
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. Menilai panjang utf8 berdasarkan ukurannya
Dari langkah sebelumnya kita mendapatkan charcode dari karakter Cina "di" adalah tahun 20013. Kemudian kita menemukan bahwa 20013 terletak di interval 2048 - 0xffff, sehingga karakter Cina "dalam" harus menempati 3 byte di UTF8.
3. Komplemen
Karena kita tahu bahwa karakter Cina "saya" perlu menempati 3 byte, bagaimana kita bisa mendapatkan 3 byte ini?
Ini membutuhkan mendesain kode komplemen. Logika kode komplemen spesifik adalah sebagai berikut:
Oke, saya tahu Anda tidak dapat memahami gambar ini, jadi saya hanya akan membicarakannya!
Kode pengisian spesifik adalah sebagai berikut, "X" menunjukkan ruang kosong, yang digunakan untuk mengisi.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110xxxx 10xxxxxx 10xxxxxx
• 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
• 1111110x 10xxxxxxxx 10xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxxxxx
PERINGATAN: Apakah Anda menemukannya? Byte pertama dari kode pengisian menunjukkan berapa banyak byte yang ditempati oleh seluruh kode UTF-8! Fitur ini digunakan oleh UTF-8 Decoded ke Unicode ~
Mari kita berikan contoh sederhana terlebih dahulu. Konversi surat bahasa Inggris "A" ke encoding UTF8.
1. Kode "A" adalah 65
2. 65 berada dalam interval antara 0-127, jadi "A" menempati satu byte
3. Komplemen satu byte di UTF8 adalah 0xxxxxxx. X mewakili posisi kosong dan digunakan untuk komplemen.
4. Konversi 65 menjadi biner menjadi 1000001
5. Tambahkan 1000001 ke lowongan 1xxxxxx dalam urutan dari depan ke belakang, dan dapatkan 01000001
6. Konversi 11000001 menjadi string untuk mendapatkan "A"
7. Akhirnya, "A" dikodekan oleh UTF8.
Dengan contoh kecil ini, apakah kami memverifikasi lagi bahwa UTF-8 adalah superset unicode!
Oke, mari kita kembali ke karakter Cina "tengah". Sebelumnya, kami telah mendapatkan charcode "tengah" sebagai tahun 20013 dan biner adalah 010011100 00101101. Detailnya adalah sebagai berikut:
VAR Code = 20013; Code.ToString (2); // => 10011100101 setara dengan 01001110 00101101
Kemudian, kami mengikuti metode "A" mengisi hal di atas untuk mengisi posisi.
Komplemen 01001110 00101101 Dalam urutan dari depan ke belakang ke 1110xxxxx 10xxxxxx 10xxxxxx. Dapatkan 11100100 10111000 10101101.
4. Dapatkan konten yang dikodekan UTF8
Melalui langkah -langkah di atas kita mendapatkan tiga byte UTF8 dari "IN", 11100100 10111000 1010110101.
Kami mengonversi setiap byte menjadi hexadecimal dan mendapatkan 0xe4 0xb8 0xad;
Kemudian 0xe4 0xb8 0xad ini adalah pengkodean UTF8 yang akhirnya kami dapatkan.
Kami menggunakan buffer nodeJS untuk memverifikasi apakah itu benar.
var buffer = buffer baru ('in'); console.log (buffer.length); // => 3console.log (buffer); // => <buffer e4 b8 ad> // akhirnya dapatkan tiga byte 0xe4 0xb8 0xadKarena hexadecimal bebas kasus, apakah persis sama dengan yang kita hitung bahwa 0xe4 0xb8 0xad?
Tulis logika pengkodean di atas ke dalam suatu fungsi.
// Format string menjadi byte encoded uTF8 var writeutf = function (str, isGetBytes) {var back = []; var bytesize = 0; untuk (var i = 0; i <str.length; i ++) {var code = str.charCodeat (i); if (0x00 <= kode && kode <= 0x7f) {bytesize += 1; back.push (kode); } else if (0x80 <= code && code <= 0x7ff) {bytesize += 2; back.push ((192 | (31 & (kode >> 6)))); back.push ((128 | (63 & kode)))} lain jika ((0x800 <= kode && kode <= 0xd7ff) || (0xe000 <= kode && kode <= 0xffff)) {bytesize += 3; back.push ((224 | (15 & (kode >> 12)))); back.push ((128 | (63 & (kode >> 6)))); back.push ((128 | (63 & kode)))}} untuk (i = 0; i <back.length; i ++) {back [i] & = 0xff; } if (isGetBytes) {return back} if (bytesize <= 0xff) {return [0, bytesize] .concat (back); } else {return [bytesize >> 8, bytesize & 0xff] .concat (back); }} writeutf ('in-on'); // => [0, 3, 228, 184, 173] // Dua digit pertama mewakili panjang byte UTF8 berikutnya. Karena panjangnya adalah 3, dua byte pertama adalah `0, 3` // kontennya adalah` 228, 184, 173` dan dikonversi menjadi hexadecimal adalah `0xe4 0xb8 0xad` // Baca byte encoded UTF8 dan dirancang khusus untuk string unicode var readutf = function (arr) {if (typeof arr === 'string') {return arr; } var utf = '', _arr = this.init (arr); untuk (var i = 0; i <_arr.length; i ++) {var satu = _arr [i] .toString (2), v = satu.match (/^1+? (? = 0)/); if (v && one.length == 8) {var byteslength = v [0] .length; var store = _arr [i] .toString (2) .slice (7 - byteslength); untuk (var st = 1; st <byteslength; st ++) {store += _arr [st +i] .toString (2) .slice (2)} utf += string.fromCharCode (parseInt (Store, 2)); i += byteslength - 1} else {utf += string.fromCharCode (_arr [i])}} return utf} readutf ([0, 3, 228, 184, 173]); => 'Di'Metode lain untuk mengurai bahasa Cina untuk mendapatkan UTF8 bytecode
Metode lain yang relatif sederhana untuk mengkonversi bahasa Cina menjadi UTF8 bytecode relatif sederhana. Browser juga menyediakan metode, dan semua orang telah menggunakan metode ini. Apa itu? Ini Encodeuri. Tentu saja, komponen enkodeurik juga baik -baik saja.
Benar, itulah metodenya. Jadi bagaimana metode ini mengubah bahasa Cina yang dikodekan unicode menjadi UTF8 bytecode?
var str = ''; var code = encodeuri (str); console.log (kode); // =>%E4%B8%AD
Pernahkah Anda menemukan bahwa saya mendapat string yang melarikan diri, dan konten dalam string ini sama dengan bytecode yang saya dapatkan sebelumnya.
Selanjutnya kami mengonversi%E4%B8%AD menjadi array angka.
var codelist = code.split ('%'); codelist = codelist.map (item => parseInt (item, 16)); console.log (codelist); // => [228, 184, 173]Sangat sederhana, apakah ada ~~~
Apa prinsip metode sederhana ini?
Inilah masalah pengkodean QueryString dalam URI. Karena menurut peraturan, QueryString di URI harus ditransmisikan sesuai dengan pengkodean UTF8, dan JavaScript adalah Unicode, sehingga browser memberi kita metode, yaitu, metode encodeuri/encodeuricomponent. Metode ini akan dijelaskan
Karakter non-Inggris (ini dipertimbangkan, mengapa karakter non-Inggris?) Pertama kali dikonversi menjadi UTF8 bytecode, dan kemudian ditambahkan%di depan untuk menyambungkannya, jadi kami lolos dari karakter Cina "中" dan mendapatkan "%E4%B8%iklan".
Nah, itu semua prinsip, tidak ada yang lain.
Namun, metode ini memiliki kelemahan lain, yaitu, hanya akan lepas dari karakter non-Inggris, jadi ketika kita perlu memformat karakter bahasa Inggris ke pengkodean UTF8, metode ini tidak dapat memenuhi kebutuhan kita, dan kita juga perlu melarikan diri dari karakter bahasa Inggris.
Jadi apa yang harus saya lakukan ketika saya ingin menganalisisnya? Cukup gunakan decodeuri/decodeuricomponent.
var codelist = [228, 184, 173]; var code = codelist.map (item => '%'+item.toString (16)). gabung (''); decodeuri (kode); // =>Oke, artikel ini akan memperkenalkan pengkodean UTF8.
Saya harap ini dapat membantu Anda memahami prinsip-prinsip penyandian UTF-8.
Di atas adalah semua metode implementasi untuk pengkodean UTF-8 melalui JavaScript yang dibawa kepada Anda. Saya harap semua orang akan mendukung wulin.com lebih banyak ~