Passa al contenuto principale

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