PROGRAMMIAMO
File - Unicode e UTF
Unicode

Unicode è un sistema di codifica che si propone di superare le limitazioni del codice ASCII e delle sue estensioni, assegnando un numero univoco ad ogni carattere usato per la scrittura di testi, in maniera indipendente dalla lingua, dalla piattaforma informatica e dal programma utilizzato. È stato compilato e viene aggiornato e pubblicizzato dall'Unicode Consortium, un consorzio internazionale di aziende interessate alla interoperabilità nel trattamento informatico dei testi in lingue diverse.

Unicode incorpora, nella primissima parte, la codifica ISO-1 (cioè, in pratica, i 256 caratteri del codice ASCII esteso per i caratteri latini), ma codifica anche i caratteri usati in quasi tutte le lingue vive e in alcune lingue morte, nonché simboli matematici e chimici, cartografici, l'alfabeto Braille, ideogrammi ecc. Attualmente non rappresenta ancora tutti i caratteri in uso nel mondo. Essendo ancora in evoluzione, si prefigge di coprire tutti i caratteri rappresentabili, garantendo la compatibilità e la non sovrapposizione con le codifiche dei caratteri già definiti, ma lasciando comunque dei ben precisi campi di codici "non usati", da riservare per la gestione autonoma all'interno di applicazioni particolari.

Struttura del codice Unicode

Unicode suddivide tutti i codici utilizzati in 17 gruppi detti piani (plane), numerati da 0 a 16. Ogni piano comprende al proprio interno 216 = 65.536 codici possibili, per un totale di 17 x 65.536 = 1.114.112 codici. Si tratta di un numero enorme di possibili caratteri e in effetti sono una minima parte dei codici è attualmente utilizzata. Infatti l'ultima versione pubblicata, Unicode 8.0 (2015), comprende in effetti "solo" 120,737 caratteri effettivamente codificati: la parte rimanente dei codici è destinata a futuri sviluppi.

La tabella qui sotto mostra la suddivisione in piani con i relativi codici Unicode (in esadecimale):

Piano Codici Nome
0 da 0 a ​FFFF Basic Multilingual Plane
1 da 10000 a ​1FFFF Supplementary Multilingual Plane
2 da 20000 a ​2FFFF Supplementary Ideographic Plane
3-13 da 30000 a ​DFFFF Attualmente non usati
14 da E0000 a ​EFFFF Supplementary Special-purpose Plane
15-16 da F0000 a ​10FFFF Supplementary Private Use Area

In pratica i caratteri di quasi tutti gli alfabeti moderni e la maggior parte dei simboli non alfabetici, occupano il cosiddetto Basic Multilingual Plane, cioè la parte bassa dei codici Unicode, che va da 0 a FFFF. Gli altri piani sono utilizzati per caratteri meno frequenti o di lingue morte (per esempio i geroglifici egizi) o sono lasciati inutilizzati.

Per rappresentare il codice Unicode corrispondente a un determinato carattere, si è soliti premettere U+ al numero del codice. Per esempio U+220105 rappresenta l'ideogramma 𢀕. Come si può notare occorrono 6 cifre esadecimali per scrivere il codice Unicode di un qualsiasi carattere.

Tuttavia i caratteri più usati, quelli che appartengono al piano 0, possono essere scritti solo con 4 cifre esadecimali, cioè 2 Byte, perciò di solito si omettono le prime due cifre (uguali a 00 per tutti questi caratteri). Ad esempio, la lettera à (a accentata) corrisponde al  codice Unicode esadecimale U+00E0 , mentre il codice U+0636 corrisponde alla lettera araba 'sad' (ض).

Per conoscere la rappresentazione di un qualsiasi carattere in una qualsiasi lingua, basta consultare l'apposita tabella dei caratteri Unicode in rete; scegliendo una lingua o un tipo di caratteri, si ottiene una tabella di questo tipo (l'esempio è tratto dalla tavola latin1):

Unicode latin1 chart

Per conoscere il codice Unicode di un qualsiasi carattere basta incrociare il valore scritto in colonna con quello in riga o leggere direttamente il codice (esadecimale) riportato sotto il carattere stesso (per esempio, osservando la tabella in figura, il codice di ò è U+00F2).

Riassumendo, lo scopo di Unicode è:

 

Unicode non è una soluzione efficiente per rappresentare i caratteri

Abbiamo detto che occorrono 6 cifre esadecimali per scrivere il codice Unicode di qualsiasi carattere, ovvero, usando la numerazione binaria, occorrerebbero 3 byte. Ma in realtà il codice Unicode non viene quasi mai usato, così com'è, per rappresentare un testo. La ragione è che "spreca" un sacco di spazio, perché assegna 3 byte a qualsiasi carattere, indipendentemente dalla sua frequenza. Così, tanto per fare un esempio, la lettera A verrebbe codificata con 3 byte esattamente come il geroglifico A1. Anzi, siccome per ragioni tecniche nei computer i byte sono normalmente raggruppati in numero pari, si dovrebbero usare 4 Byte per scrivere ogni carattere.

Abbiamo accennato prima al fatto che i caratteri di quasi tutte le lingue esistenti si possono scrivere con solo 4 cifre esadecimali (2 Byte), dal momento che le prime due cifre di tali codici sono sempre 00. Per questa ragione si può scrivere ad esempio U+00F2 per la ò accentata, invece del più scomodo U+0000F2.

Ma c'è di più: siccome i primi 256 caratteri del codice Unicode corrispondono in pratica al codice ASCII esteso della codifica ISO-1, basterebbero in realtà solo due cifre esadecimali (1 byte) per scrivere tutte le lettere usate dagli alfabeti latini (tali codici infatti iniziano tutti con quattro zeri 0000).

In pratica: Unicode è un elenco di tutti i possibili caratteri (si dice anche che è un set di caratteri). Tale set di caratteri deve essere trasformato però in una rappresentazione binaria più efficiente allo scopo di utilizzarlo nei computer. Tale trasformazione viene effettuata per mezzo di un algoritmo di codifica (detto anche code o encoding), cioè in pratica un metodo che trasforma ogni numero Unicode (detto anche code point) in un carattere binario.

 

UTF-8: un codice a lunghezza variabile

Una codifica più efficiente e frequentemente usata è quella detta UTF-8. Si tratta di una codifica a lunghezza variabile che utilizza da 1 a 4 Byte per rappresentare tutti i caratteri Unicode.

I caratteri più frequenti (almeno nelle lingue latine) vengono scritti usando un solo byte e il loro codice coincide con la codifica ASCII. In pratica i caratteri da U+0000 fino a U+007F, cioè tutti quelli in cui il byte inizia con 0 (0XXX XXXX) sono i caratteri ASCII. In questo modo tutti i file codificati in ASCII sono compatibili con Unicode.

I caratteri da U+0080 a U+07FF sono codificati usando 2 byte (comprendono gli alfabeti Latino con diacritici, Greco, Cirillico, Copto, Armeno, Ebraico e Arabo), quelli da U+000800 a U+00FFFF 3 byte e infine quelli da U+010000 a U+10FFFF usano 4 byte, secondo lo schema seguente:

Intervallo Unicode Byte usati Byte 1 Byte 2 Byte 3 Byte 4
U+00000000 U+0000007F 1 0xxxxxxx
U+00000080 U+000007FF 2 110xxxxx 10xxxxxx
U+00000800 U+0000FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 U+001FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Il codice UTF-8 è congegnato in modo tale che, dato una sequenza di byte, è possibile interpretarne sempre correttamente il significato. Supponiamo per esempio di dover interpretare la sequenza binaria

1100 1001 1011 0001 0111 0010 (C9 A1 72)

Il primo byte della sequenza (1100 1001) inizia con 110: dunque si tratta di un carattere che appartiene al secondo gruppo. Per vedere di quale carattere si tratta, dobbiamo guardare anche il secondo byte (1011 0001) che inizia con 10. Il carattere corrispondente ai primi due byte della stringa (1100 1001 1011 0001 = C9 A1) è 즡.

Il terzo byte (0111 0010 = 72) inizia con zero. Si tratta dunque di un carattere del primo gruppo e corrisponde alla lettera 'r'.

In generale il codice UTF-8 non coincide col codice Unicode: si tratta di due numeri diversi. Per esempio il carattere Ø ha un code point U+00D8, mentre in UTF-8 viene rappresentato con C3 98. Su internet sono disponibili tabelle di conversione che permettono di vedere la corrispondenza fra Unicode e UTF-8 e convertitori con i quali si può convertire qualsiasi code point in UTF-8 e viceversa.

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it