Lihat juga Bagaimana file dengan karakter Cina mengetahui berapa banyak byte yang digunakan per karakter? - tidak diragukan lagi, ada pertanyaan SO lain yang juga akan membantu.
Dalam UTF-8, Anda mendapatkan jenis byte berikut:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(Baris terakhir terlihat seolah-olah membaca 0xF0..0xF7; namun, kisaran 21-bit Unicode (U + 0000 - U + 10FFFF) berarti bahwa nilai valid maksimum adalah 0xF4; nilai 0xF5..0xF7 tidak dapat terjadi di UTF-8 yang valid.)
Melihat apakah urutan byte tertentu adalah UTF-8 yang valid berarti Anda perlu memikirkan tentang:
- Byte kelanjutan muncul di tempat yang tidak diharapkan
- Byte non-lanjutan muncul di tempat yang diharapkan byte lanjutan
- Karakter tidak lengkap di akhir string (variasi 'byte lanjutan diharapkan')
- Urutan non-minimal
- Pengganti UTF-16
Dalam UTF-8 yang valid, byte 0xF5..0xFF tidak dapat terjadi.
Urutan non-minimal
Ada beberapa kemungkinan representasi untuk beberapa karakter. Misalnya, karakter Unicode U + 0000 (ASCII NUL) dapat diwakili oleh:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Namun, standar Unicode dengan jelas menyatakan bahwa tiga alternatif terakhir tidak dapat diterima karena tidak minimal. Kebetulan byte 0xC0 dan 0xC1 tidak pernah dapat muncul dalam UTF-8 yang valid karena satu-satunya karakter yang dapat dikodekan olehnya minimal dikodekan sebagai karakter byte tunggal dalam kisaran 0x00..0x7F.
Pengganti UTF-16
Dalam Basic Multi-lingual Plane (BMP), nilai Unicode U + D800 - U + DFFF dicadangkan untuk pengganti UTF-16 dan tidak dapat muncul dikodekan dalam UTF-8 yang valid. Jika mereka valid dalam UTF-8 (yang, saya tekankan, mereka tidak valid), maka pengganti akan dikodekan:
- U + D800 - 0xED 0xA0 0x80 (pengganti tinggi terkecil)
- U + DBFF - 0xED 0xAF 0xBF (pengganti tinggi terbesar)
- U + DC00 - 0xED 0xB0 0x80 (pengganti rendah terkecil)
- U + DFFF - 0xED 0xBF 0xBF (pengganti rendah terbesar)
Data Buruk
Jadi, data BAD Anda harus berisi contoh yang melanggar berbagai resep ini.
- Byte lanjutan tidak diawali dengan salah satu nilai byte awal
- Byte awal multi-karakter tidak diikuti oleh byte lanjutan yang cukup
- Karakter multi-byte non-minimal
- Pengganti UTF-16
- Byte tidak valid (0xC0, 0xC1, 0xF5..0xFF).
Perhatikan bahwa byte-order mark (BOM) U + FEFF, alias zero-width no-break space (ZWNBSP), tidak dapat muncul tanpa kode dalam UTF-8 - byte 0xFF dan 0xFE tidak diizinkan dalam UTF-8 yang valid. ZWNBSP yang dienkode dapat muncul dalam file UTF-8 sebagai 0xEF 0xBB 0xBF, tetapi BOM benar-benar berlebihan dalam UTF-8.
Ada juga beberapa nonkarakter di Unicode. U + FFFE dan U + FFFF adalah dua karakter nonkarakter (dan dua titik kode terakhir di setiap bidang, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF adalah lainnya ). Ini biasanya tidak muncul dalam data Unicode untuk pertukaran data, tetapi dapat muncul untuk penggunaan pribadi. Lihat tautan FAQ Unicode untuk banyak detail kotor, termasuk riwayat nonkarakter yang agak rumit di Unicode. ( Corrigendum # 9: Clarification About Noncharacters , yang dirilis pada Januari 2013, melakukan apa yang disarankan oleh judulnya - menjelaskan arti non-karakter.)