Vedi anche Come fa un file con caratteri cinesi a sapere quanti byte usare per carattere? - senza dubbio, ci sono anche altre domande SO che potrebbero aiutare.
In UTF-8, ottieni i seguenti tipi di byte:
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
(L'ultima riga sembra che dovrebbe leggere 0xF0..0xF7; tuttavia, l'intervallo di 21 bit di Unicode (U + 0000 - U + 10FFFF) significa che il valore massimo valido è 0xF4; i valori 0xF5..0xF7 non possono verificarsi in valido UTF-8.)
Controllare se una particolare sequenza di byte è valida UTF-8 significa che devi pensare a:
- Byte di continuazione che compaiono dove non previsto
- Byte di non continuazione che appaiono dove è previsto un byte di continuazione
- Caratteri incompleti alla fine della stringa (variazione di "byte di continuazione previsto")
- Sequenze non minime
- Surrogati UTF-16
In UTF-8 valido, i byte 0xF5..0xFF non possono verificarsi.
Sequenze non minime
Esistono più rappresentazioni possibili per alcuni personaggi. Ad esempio, il carattere Unicode U + 0000 (ASCII NUL) potrebbe essere rappresentato da:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Tuttavia, lo standard Unicode afferma chiaramente che le ultime tre alternative non sono accettabili perché non sono minime. Accade così che i byte 0xC0 e 0xC1 non possano mai apparire in UTF-8 valido perché gli unici caratteri che potrebbero essere codificati da questi sono codificati minimamente come caratteri a byte singolo nell'intervallo 0x00..0x7F.
UTF-16 surrogati
All'interno del Basic Multi-lingual Plane (BMP), i valori Unicode U + D800 - U + DFFF sono riservati ai surrogati UTF-16 e non possono essere codificati in UTF-8 valido. Se fossero validi in UTF-8 (che, sottolineo, non lo sono), allora i surrogati sarebbero codificati:
- U + D800 - 0xED 0xA0 0x80 (surrogato più piccolo alto)
- U + DBFF - 0xED 0xAF 0xBF (surrogato alto più grande)
- U + DC00 - 0xED 0xB0 0x80 (surrogato basso più piccolo)
- U + DFFF - 0xED 0xBF 0xBF (surrogato basso più grande)
Cattivi dati
Quindi, i tuoi dati BAD dovrebbero contenere campioni che violano queste varie prescrizioni.
- Byte di continuazione non preceduto da uno dei valori di byte iniziali
- Byte iniziali di più caratteri non seguiti da byte di continuazione sufficienti
- Caratteri multibyte non minimi
- Surrogati UTF-16
- Byte non validi (0xC0, 0xC1, 0xF5..0xFF).
Si noti che un contrassegno di ordine dei byte (BOM) U + FEFF, noto anche come spazio senza interruzioni di larghezza zero (ZWNBSP), non può apparire non codificato in UTF-8: i byte 0xFF e 0xFE non sono consentiti in UTF-8 valido. Uno ZWNBSP codificato può apparire in un file UTF-8 come 0xEF 0xBB 0xBF, ma la distinta componenti è completamente superflua in UTF-8.
Ci sono anche alcuni non caratteri in Unicode. U + FFFE e U + FFFF sono due di questi non caratteri (e gli ultimi due punti di codice in ciascun piano, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF sono altri ). Normalmente non dovrebbero apparire nei dati Unicode per lo scambio di dati, ma possono apparire in uso privato. Vedi il collegamento FAQ Unicode per molti sordidi dettagli, inclusa la storia piuttosto complessa dei non caratteri in Unicode. ( Corrigendum # 9: Clarification About Noncharacters , che è stato rilasciato nel gennaio 2013, fa quello che suggerisce il titolo - chiarisce il significato dei non-personaggi.)