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.
128 karakter pertama (US-ASCII) membutuhkan satu byte.
1.920 karakter berikutnya membutuhkan dua byte untuk dikodekan. Ini mencakup sisa hampir semua huruf Latin, dan juga huruf Yunani, Sirilik, Koptik, Armenia, Ibrani, Arab, Siria, dan Tāna, serta Menggabungkan Tanda Diakritik.
Tiga byte dibutuhkan untuk karakter dalam Basic Multilingual Plane, yang berisi hampir semua karakter yang umum digunakan [12] termasuk kebanyakan karakter China, Jepang dan Korea [CJK].
Empat byte diperlukan untuk karakter di bidang lain Unicode, yang mencakup karakter CJK yang kurang umum, berbagai skrip bersejarah, simbol matematika, dan emoji (simbol piktografik).
sumber: Wikipedia
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.
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.
2017-07-11: Dikoreksi untuk penghitungan ganda titik kode yang sama yang dikodekan dengan beberapa byte
0xxxxxxx
memberikan 7 bit yang dapat digunakan, 110xxxxx 10xxxxxx
memberikan 11 lebih - tidak ada tumpang tindih. Byte pertama dimulai dengan 0
dalam kasus pertama, dan 1
dalam kasus kedua.
00000001
disimpan dan apa yang 11000000 100000001
disimpan?
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 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.
17 pesawat dapat menampung 1.114.112 poin kode. Dari jumlah tersebut, 2.048 pengganti, 66 non-karakter, dan 137.468 dicadangkan untuk penggunaan pribadi, menyisakan 974.530 untuk tugas publik.
Sekarang mari kembali ke artikel yang ditautkan di atas,
Skema pengkodean yang digunakan oleh UTF-8 dirancang dengan batas yang jauh lebih besar yaitu 2 31 titik kode (32.768 bidang), dan dapat menyandikan 2 21 titik kode (32 bidang) meskipun dibatasi hingga 4 byte. [3] Karena Unicode membatasi poin kode ke 17 bidang yang dapat dikodekan oleh UTF-16, poin kode di atas 0x10FFFF tidak valid di UTF-8 dan UTF-32.
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 dari17 * 2^16
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.
UTF-8 adalah pengkodean panjang variabel dengan minimal 8 bit per karakter.
Karakter dengan poin kode lebih tinggi akan membutuhkan hingga 32 bit.
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:
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.
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 ).
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
Standar Unicode mengkodekan karakter dalam kisaran U + 0000..U + 10FFFF, yang berarti ruang kode 21-bit.
Dari halaman Wikipedia UTF-8. Deskripsi UTF-8
Sejak pembatasan ruang kode Unicode menjadi nilai 21-bit pada tahun 2003, UTF-8 didefinisikan untuk menyandikan titik kode dalam satu hingga empat byte, ...