Jika UTF-8 adalah 8 bit, bukan berarti hanya boleh ada maksimal 256 karakter yang berbeda?
128 poin kode pertama sama seperti di ASCII. Tetapi dikatakan bahwa UTF-8 dapat mendukung hingga jutaan karakter?
Bagaimana cara kerjanya?
Jika UTF-8 adalah 8 bit, bukan berarti hanya boleh ada maksimal 256 karakter yang berbeda?
128 poin kode pertama sama seperti di ASCII. Tetapi dikatakan bahwa UTF-8 dapat mendukung hingga jutaan karakter?
Bagaimana cara kerjanya?
Jawaban:
UTF-8 tidak menggunakan satu byte sepanjang waktu, ini 1 hingga 4 byte.
sumber: Wikipedia
sumber
UTF-8 menggunakan 1-4 byte per karakter: satu byte untuk karakter ascii (128 nilai unicode pertama sama dengan ascii). Tapi itu hanya membutuhkan 7 bit. Jika bit tertinggi ("tanda") ditetapkan, ini menunjukkan awal dari urutan multi-byte; jumlah set bit tinggi berurutan menunjukkan jumlah byte, kemudian 0, dan bit yang tersisa berkontribusi pada nilai. Untuk byte lainnya, dua bit tertinggi adalah 1 dan 0 dan 6 bit sisanya untuk nilainya.
Jadi urutan empat byte akan dimulai dengan 11110 ... (dan ... = tiga bit untuk nilai) kemudian tiga byte dengan masing-masing 6 bit untuk nilai, menghasilkan nilai 21 bit. 2 ^ 21 melebihi jumlah karakter unicode, sehingga semua unicode dapat diekspresikan dalam UTF8.
sumber
Menurut tabel ini * UTF-8 harus mendukung:
2 31 = 2.147.483.648 karakter
Namun, RFC 3629 membatasi nilai yang mungkin, jadi sekarang kita dibatasi pada 4 byte , yang memberi kita
2 21 = 2.097.152 karakter
Perhatikan bahwa sebagian besar karakter tersebut "dicadangkan" untuk penggunaan khusus, yang sebenarnya cukup berguna untuk font ikon.
* Wikipedia digunakan menunjukkan tabel dengan 6 byte - mereka telah memperbarui artikel.
sumber
0xxxxxxx
memberikan 7 bit yang dapat digunakan,110xxxxx 10xxxxxx
memberikan 11 lebih - tidak ada tumpang tindih. Byte pertama dimulai dengan0
dalam kasus pertama, dan1
dalam kasus kedua.00000001
disimpan dan apa yang11000000 100000001
disimpan?Unicode vs UTF-8
Unicode menyelesaikan poin kode ke karakter. UTF-8 adalah mekanisme penyimpanan untuk Unicode. Unicode memiliki spesifikasi. UTF-8 memiliki spesifikasi. Keduanya memiliki batasan yang berbeda. UTF-8 memiliki ikatan ke atas yang berbeda.
Unicode
Unicode ditandai dengan "pesawat". Setiap pesawat membawa 2 16 poin kode. Ada 17 Pesawat di Unicode. Untuk total
17 * 2^16
poin kode. Bidang pertama, bidang 0 atau BMP , khusus dalam berat dari apa yang membawa.Daripada menjelaskan semua nuansa, izinkan saya mengutip artikel di atas tentang pesawat.
UTF-8
Sekarang mari kembali ke artikel yang ditautkan di atas,
Jadi Anda dapat melihat bahwa Anda dapat memasukkan barang ke UTF-8 yang bukan Unicode yang valid. Mengapa? Karena UTF-8 mengakomodasi titik kode yang bahkan tidak didukung oleh Unicode.
UTF-8, bahkan dengan batasan empat byte, mendukung 2 21 poin kode, yang jauh lebih dari
17 * 2^16
sumber
2.164.864 "karakter" dapat berpotensi dikodekan oleh UTF-8.
Angka ini adalah 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 yang berasal dari cara kerja encoding:
Karakter 1-byte memiliki 7 bit untuk pengkodean
0xxxxxxx
(0x00-0x7F)Karakter 2-byte memiliki 11 bit untuk pengkodean
110xxxxx 10xxxxxx
(0xC0-0xDF untuk byte pertama; 0x80-0xBF untuk yang kedua)Karakter 3-byte memiliki 16 bit untuk encoding
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF untuk byte pertama; 0x80-0xBF untuk byte lanjutan)Karakter 4-byte memiliki 21 bit untuk encoding
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0xF0-0xF7 untuk byte pertama; 0x80-0xBF untuk byte lanjutan)Seperti yang Anda lihat, ini jauh lebih besar dari Unicode saat ini (1.112.064 karakter).
MEMPERBARUI
Perhitungan awal saya salah karena tidak mempertimbangkan aturan tambahan. Lihat komentar untuk jawaban ini untuk lebih jelasnya.
sumber
UTF-8 adalah pengkodean panjang variabel dengan minimal 8 bit per karakter.
Karakter dengan poin kode lebih tinggi akan membutuhkan hingga 32 bit.
sumber
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, jadi hanya 21 bit yang dapat digunakan untuk menyandikan karakter sebenarnya.Kutipan dari Wikipedia: "UTF-8 menyandikan masing-masing 1.112.064 titik kode dalam rangkaian karakter Unicode menggunakan satu hingga empat byte 8-bit (disebut" oktet "dalam Unicode Standard)."
Beberapa tautan:
sumber
Lihat Unicode Standard dan informasi terkait, seperti entri FAQ mereka, UTF-8 UTF-16, UTF-32 & BOM . Tidak semulus itu, tetapi ini adalah informasi yang berwibawa, dan banyak dari apa yang mungkin Anda baca tentang UTF-8 di tempat lain patut dipertanyakan.
"8" dalam "UTF-8" berhubungan dengan panjang unit kode dalam bit. Unit kode adalah entitas yang digunakan untuk menyandikan karakter, tidak harus sebagai pemetaan satu-ke-satu yang sederhana. UTF-8 menggunakan sejumlah variabel unit kode untuk menyandikan karakter.
Kumpulan karakter yang dapat dikodekan dalam UTF-8 sama persis dengan UTF-16 atau UTF-32, yaitu semua karakter Unicode. Mereka semua menyandikan seluruh ruang pengkodean Unicode, yang bahkan mencakup nonkarakter dan poin kode yang belum ditetapkan.
sumber
Meskipun saya setuju dengan mpen pada kode UTF-8 maksimum saat ini (2.164.864) (tercantum di bawah, saya tidak dapat mengomentarinya), dia mati dengan 2 level jika Anda menghapus 2 batasan utama UTF-8: hanya 4 byte batas dan kode 254 dan 255 tidak dapat digunakan (dia hanya menghapus batas 4 byte).
Kode awal 254 mengikuti pengaturan dasar bit awal (flag multi-bit disetel ke 1, hitungan 6 1, dan terminal 0, tanpa bit cadangan) memberi Anda 6 byte tambahan untuk dikerjakan (6 grup 10xxxxxx, tambahan 2 ^ 36 kode).
Kode awal 255 tidak sepenuhnya mengikuti pengaturan dasar, tidak ada terminal 0 tetapi semua bit digunakan, memberi Anda 7 byte tambahan (bendera multi-bit disetel ke 1, hitungan 7 1, dan tidak ada terminal 0 karena semua bit digunakan ; 7 grup 10xxxxxx, kode tambahan 2 ^ 42).
Menambahkan ini dalam memberikan kumpulan karakter yang dapat ditampilkan maksimum akhir dari 4.468.982.745.216. Ini lebih dari semua karakter yang digunakan saat ini, bahasa lama atau bahasa mati, dan bahasa apa pun yang diyakini hilang. Naskah Angelic atau Celestial siapa?
Juga ada kode byte tunggal yang diabaikan / diabaikan dalam standar UTF-8 selain 254 dan 255: 128-191, dan beberapa lainnya. Beberapa digunakan secara lokal oleh keyboard, contoh kode 128 biasanya menghapus backspace. Kode awal lainnya (dan rentang terkait) tidak valid karena satu atau beberapa alasan ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
sumber
Unicode secara resmi menikah dengan UTF-8. Unicode secara khusus mendukung 2 ^ 21 titik kode (2.097.152 karakter) yang merupakan jumlah titik kode yang sama persis yang didukung oleh UTF-8. Kedua sistem mencadangkan ruang 'mati' dan zona terbatas yang sama untuk poin kode dll. ... per Juni 2018 versi terbaru, Unicode 11.0, berisi repertoar 137.439 karakter
Dari standar unicode. FAQ Unicode
Dari halaman Wikipedia UTF-8. Deskripsi UTF-8
sumber