3. Definizione di UTF-8
UTF-8 è definito dallo standard Unicode [UNICODE]. Descrizioni e formule si trovano anche nell'Allegato D di ISO/IEC 10646-1 [ISO.10646].
Intervallo di codifica
In UTF-8, i caratteri dell'intervallo U+0000..U+10FFFF (l'intervallo accessibile a UTF-16) sono codificati mediante sequenze da 1 a 4 ottetti.
Sequenze di un solo ottetto
L'unico ottetto di una "sequenza" di uno ha il bit di ordine superiore impostato a 0, mentre i restanti 7 bit sono utilizzati per codificare il numero del carattere.
Sequenze multi-ottetto
In una sequenza di n ottetti, con n>1:
- L'ottetto iniziale ha gli n bit di ordine superiore impostati a 1, seguiti da un bit impostato a 0
- I bit rimanenti di quell'ottetto contengono bit del numero del carattere da codificare
- Gli ottetti successivi hanno tutti il bit di ordine superiore impostato a 1 e il bit seguente impostato a 0, lasciando 6 bit in ciascuno per contenere bit del carattere da codificare
Tabella di codifica
La tabella seguente riassume il formato di questi diversi tipi di ottetto. La lettera x indica i bit disponibili per codificare i bit del numero del carattere.
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Algoritmo di codifica
La codifica di un carattere in UTF-8 procede come segue:
Passo 1: determinare il numero di ottetti
Determinare il numero di ottetti richiesti a partire dal numero del carattere e dalla prima colonna della tabella precedente. È importante notare che le righe della tabella sono mutuamente esclusive, ossia esiste un solo modo valido di codificare un dato carattere.
Passo 2: preparare i bit di ordine superiore
Preparare i bit di ordine superiore degli ottetti secondo la seconda colonna della tabella.
Passo 3: inserire i bit del carattere
Inserire i bit contrassegnati con x a partire dai bit del numero del carattere, espresso in binario. Iniziare collocando il bit di ordine più basso del numero del carattere nella posizione di ordine più basso dell'ultimo ottetto della sequenza, quindi collocare il bit successivo di ordine superiore del numero del carattere nella successiva posizione di ordine superiore di quell'ottetto, e così via. Quando i bit x dell'ultimo ottetto sono stati riempiti, passare al penultimo ottetto, poi a quello precedente, e così via finché tutti i bit x non sono stati riempiti.
Intervalli di caratteri riservati
La definizione di UTF-8 vieta la codifica dei numeri di carattere compresi tra U+D800 e U+DFFF, che sono riservati all'uso con la forma di codifica UTF-16 (come coppie surrogate) e non rappresentano direttamente dei caratteri.
Conversione da UTF-16
Quando si codifica in UTF-8 a partire da dati UTF-16, è necessario decodificare prima i dati UTF-16 per ottenere i numeri di carattere, che vengono poi codificati in UTF-8 come descritto sopra.
Confronto con CESU-8
Ciò è in contrasto con CESU-8 [CESU-8], una codifica simile a UTF-8 che non è destinata all'uso su Internet. CESU-8 opera in modo analogo a UTF-8 ma codifica i valori di codice UTF-16 (quantità a 16 bit) anziché il numero del carattere (code point). Questo porta a risultati differenti per i numeri di carattere superiori a 0xFFFF; la codifica CESU-8 di tali caratteri NON è UTF-8 valido.
Algoritmo di decodifica
La decodifica di un carattere UTF-8 procede come segue:
Passo 1: inizializzare il numero binario
Inizializzare un numero binario con tutti i bit impostati a 0. Possono essere necessari fino a 21 bit.
Passo 2: determinare i bit del carattere
Determinare quali bit codificano il numero del carattere a partire dal numero di ottetti della sequenza e dalla seconda colonna della tabella precedente (i bit contrassegnati con x).
Passo 3: distribuire i bit
Distribuire i bit della sequenza nel numero binario, dapprima i bit di ordine inferiore dall'ultimo ottetto della sequenza e procedendo verso sinistra finché non restano più bit x. Il numero binario è ora uguale al numero del carattere.
Requisito di sicurezza
Le implementazioni dell'algoritmo di decodifica sopra descritto MUST proteggersi dalla decodifica di sequenze non valide.
Esempi di sequenze non valide
Ad esempio, un'implementazione ingenua potrebbe:
- Decodificare la sequenza UTF-8 troppo lunga (overlong) C0 80 nel carattere U+0000
- Decodificare la coppia surrogata ED A1 8C ED BE B4 in U+233B4
La decodifica di sequenze non valide può avere conseguenze sulla sicurezza o causare altri problemi. Si vedano le Considerazioni sulla sicurezza (Sezione 10) più avanti.
Collegamenti correlati
- Precedente: 2. Convenzioni di notazione
- Torna alla pagina principale RFC 3629
- Successivo: 4. Sintassi delle sequenze di byte UTF-8