Chiedete a programmatori e sistemisti qual è l’unico set di caratteri degno di esistere e la maggior parte risponderà l’ASCII standard (quello vero, a 7 bit).
Purtroppo dobbiamo aver a che fare con chi paga il nostro lavoro, gli utenti, quindi 96 caratteri stampabili e 32 di controllo sono pochi.
Se Unicode risolve egregiamente il problema della mappatura di caratteri e simboli, il problema di utilizzarlo in maniera nativa come codifica all’interno di una piattaforma è l’incredibile spreco di spazio (RAM, disco, banda di trasmissione).
Un testo “Hello World” (11 lettere) in ASCII (a 8 bit) occupa 11 byte, ma occuperebbe il doppio in Unicode-16 e il quadruplo in Unicode-32 (la codifica attuale di Unicode).
Una A maiuscola a 8 bit è 01000001
, codificata in Unicode a 32 bit è 00000000000000000000000001000001
Il vero problema è che l’aumento di spazio non avrebbe, nella stragrande maggioranza dei casi, un corrispettivo aumento di funzionalità.
Inoltre, in alcuni sistemi una sequenza di 8 bit a zero, il carattere NULL, è considerato un terminatore di stringa, quindi la A a 32 bit Unicode non arriverebbe mai o non verrebbe mai visualizzata.
Due anni dopo la nascita del consorzio Unicode viene presentato al mondo UTF-8.
Lo scopo di UTF-8 è quello di rappresentare tutti i caratteri di Unicode utilizzando una codifica a lunghezza variabile senza mai avere una sequenza di 8 bit consecutivi a zero.
La codifica a lunghezza variabile è un espediente utilizzato spesso in informatica e non solo: il sistema di prefissi telefonici italiani si basa sulla codifica a lunghezza variabile: esistono i prefissi 02 e 06 ma nessun altro prefisso inizia con 02 o 06. Parimenti, esistono tanti prefissi che iniziano con 01 (Piemonte e Liguria), 03 (Lombardia e, per un certo periodo, i cellulari), 04 (Triveneto ed Emilia), ma nessun prefisso è esattamente 01, 03 o 04.
UTF-8 parte da ASCII: se deve essere rappresentato un carattere ASCII (da 0 a 127), si utilizzano 8 bit con il bit più alto a 0 e gli altri sette che rappresentano il carattere. Quindi la A resta 01000001
.
Il passo successivo è utilizzare due byte codificati in un modo particolare per rappresentare valori fino a 11 bit in questo modo:
110xxxxx 10xxxxxx
Per rappresentare valori fino a 16 bit si utilizzano tre byte in questo formato:
1110xxxx 10xxxxxx 10xxxxxx
e così via fino ad arrivare alla rappresentazione di 31 bit:
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Come si può intuire, nella codifica UTF-8 l’ottavo bit è sempre a 1, a meno che non sia un byte che sta rappresentando uno dei primi 127 caratteri.
In ogni caso, l’inizio di un carattere può essere la sequenza 0xxxxxxx
oppure 11xxxxxx
, ogni altra sequenza indica la continuazione della codifica di un carattere.
Inoltre, in una codifica multibyte, nel primo byte di codifica il numero di bit a 1 partendo dal più alto prima di incontrare il primo zero indica il numero di byte che compongono la codifica.
Queste due semplici regole permettono di gestire in maniera molto efficace la scansione dei testi da parte dei programmi.
Nel novembre 2003 lo spazio di codifica di UTF-8 è stato limitato da RFC3629 a
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
rimuovendo la codifica c cinque sei byte per evitare problemi con la codifica UTF-16.
In questo momento UTF-8 è il metodo di codifica caratteri più utilizzato e lo resterà probabilmente finché qualcuno non troverà un sistema migliore, oppure quando 32 o 64 bit per carattere diventeranno una dimensione ragionevole per poter evitare codifiche a lunghezza variabile.
Lascia un commento