Codifica Caratteri
Se il più piccolo elemento atomico del DNA dell'informazione è il bit, potremmo considerare il carattere l'unità atomica dell'informazione.
Il grado più basso della codifica informatica dei testi è quindi la codifica dei caratteri.
Come abbiamo visto i computer sono in grado soltanto di trattare numeri in formato binario, affinché l'elaboratore sia in grado di operare con lettere o altri segni è necessario creare delle tabelle per la conversione dei numeri (bit) in caratteri (lettere, numeri, etc.), semplificando al massimo, possiamo dire che con queste tavole si assegna ad ogni carattere un numero.
Le tavole dei caratteri
Si suole parlare di character repertoire per l'insieme dei simboli che si vuol rappresentare, di code set per i codici numerici che fanno riferimento ai simboli delcaracter repertoire, l'insieme risultante di character repertoire e code set è dettocoded character set o charset; abitualmente i charset vengono rappresentati sotto forma di tabelle contenenti i simboli ed i rispettivi codici numerici, per questo motivo si suole parlare di tavole dei caratteri o code table.
Un piccolo esempio potrà aiutare a comprendere meglio quanto appena detto.
Allorché digitiamo sulla tastiera un tasto, per esempio la A maiuscola, mandiamo al computer un impulso elettrico, dei bit rappresentanti un numero binario, per la precisione nel caso della A maiuscola 1000001, il computer va a verificare nella propria tavola caratteri che il numero binario ricevuto corrisponde alla posizione 65 che a sua volta corrisponde al simbolo A, allora l'elaboratore preleva dal proprio repertorio di simboli grafici, "font", il glifo, ossia l'immagine del simbolo scelto, e lo manda a video. Lo stesso procedimento di corrispondenze fra numeri e simboli avviene allorquando apriamo un file contenente testo, tutti i codici numerici dei caratteri del file vengono tradotti nelle rispettive immagini grafiche e mandati in output.
È opportuna una precisazione, i caratteri contenuti nei charset non sono solo caratteri grafici, ma poiché un computer deve gestire non solo i cosiddetti caratteri "stampabili", ossia tutti quelli associati ad un simbolo grafico, ma anche istruzioni per la visualizzazione e le operazioni sui files, un carattere può anche, per esempio, rappresentare il comando di "a capo", il comando d'emissione di un segnale sonoro , o il segnale di inizio o di fine di un file; tali caratteri per lo più vengono usati nella trasmissione dati tra computers, o tra computer e stampante, e prendono il nome di caratteri di controllo; in genere ai caratteri di controllo vengono assegnate le prime 32 posizioni delle tavole dei caratteri.
Un po' di storia
Come detto, tutti i computer memorizzano il testo sotto forma di numeri. È tuttavia possibile che sistemi diversi memorizzino lo stesso testo utilizzando formati numerici differenti, e quindi possibile che il valore numerico che corrisponde ad un determinato carattere in un sistema , corrisponda a tutt'altro carattere in un altro; ad esempio in un computer che esegue Microsoft Windows utilizzando la tabella codici predefinita 1252 e in un computer Apple Macintosh che utilizza la tabella codici Macintosh Roman, la posizione 232 di queste tabelle dei caratteri corrisponde rispettivamente alla lettera è nel sistema Windows ed alla lettera Ëin quello Macintosh[8]. Quindi transitando da un sistema all'altro un documento contenente testo vedrebbe sostituite tutte le è conË.
Agli albori dell'era informatica il problema dell'incomunicabilità fra sistemi era assai diffuso. Ogni apparato informatico usava la propria tavola dei caratteri, spesso totalmente incompatibile con quella degli altri sistemi; si è parlato perciò di "babele informatica". Per cercare di ovviare a tutto questo, a partire dal 1963, un gruppo di studiosi tra cui Robert W. Bemer (considerato il padre dell'ASCII), si impegnarono nello sviluppo di un sistema di codifica standard per l'interoperabilità e l'interscambio di informazioni tra computers. Il lavoro di sviluppo culminò nel 1968 con l'approvazione da parte dell'ente nazionale americano per la standardizzazione (ANSI), che registrò come standard nazionale la tavola che prese il nome di American standard code for information interchange, meglio conosciuta come ASCII. (vedi tavola 1)
La tavola ASCII fa uso di sette bit per determinare i caratteri, cosicché sono solo 128 le posizioni possibili nella stessa (trattandosi ovviamente di tutte le combinazioni possibili di 0 e 1: 27 = 128).
Nel set ASCII, i primi 32 codici sono assegnati a caratteri di controllo, i restanti 96 codici sono assegnati ai segni d'interpunzione ed altri simboli, alle cifre da 0 a 9 e alle lettere dell'alfabeto latino, maiuscole e minuscole; mancano totalmente le lettere accentate di cui la lingua inglese non fa uso.
Nonostante tutto ciò, fu grande il successo di questa tavola, tanto che tutt'oggi è usata soprattutto per quanto riguarda le comunicazioni telematiche e la posta elettronica, e resta tuttora, praticamente, la sola universalmente condivisa da tutte le macchine.
Nel 1991 l'ISO[9] ha registrato, rendendola standard internazionale, la tavola ASCII col nome di ISO 646-IRV (International Reference Version).
Ben presto ci si rese conto, soprattutto da parte dei paesi non anglofoni, dell'inadeguatezza del charset ASCII per i testi scritti nella propria lingua madre. Si usavano vari espedienti per rappresentare le lettere accentate ed i vari simboli diacritici delle scritture occidentali, finché non si pensò di portare da 7 a 8 i bit della tavola ASCII, così il numero di caratteri disponibile divenne 256 (28 = 256), si ebbe in tal modo il cosiddetto ASCII esteso, che nelle varie versioni internazionali ospitava tutti quei caratteri non presenti nell'ASCII a 7 bit.
A partire dagli anni ottanta, soprattutto per opera della European Computer Manufacturer's Association (ECMA), sono stati rilasciati numerosi charset a 8 bit affinché fossero usati come standard per determinati gruppi di lingue, i quali furono successivamente recepiti dalla ISO e rilasciati come standard internazionali col nome di ISO 8859.
Particolarmente diffuso è il code set ISO 8859-1, meglio conosciuto come ISO Latin 1, dal nome della precedente tavola ECMA . Esso contiene i caratteri principali delle lingue occidentali e anglosassoni con alfabeti latini, ed è usato da molte applicazioni Internet, e da molti sistemi operativi. La dicitura "-1" sta ad indicare che si tratta della prima di una serie di tavole, ad esempio la ISO 8859-2 è invece usata per le scritture latine del centro e dell'est europeo; la più recente è la ISO 8859-15, la quale è uguale alla ISO 8859-1 con in più l'aggiunta del simbolo dell'euro .
Queste tavole sono costruite tutte in modo che per la prima metà garantiscono l'interoperabilità fra computers, così i primi 128 caratteri sono esattamente quelli di Iso 646 Irv; la seconda metà cerca di soddisfare, con altri 96 caratteri stampabili, le necessità di specifiche lingue o gruppi di lingue.
Prospettive future
Se le tavole ISO 8859 hanno rappresentato un importante passo avanti per quanto riguarda l'interscambio di comunicazioni soprattutto all'interno di uno stesso gruppo linguistico, tuttavia continuano a persistere problemi nella visualizzazione di testi rappresentati con differenti tavole dei caratteri. Per cercare di risolvere il problema della "Babele informatica", a partire dagli inizi degli anni ottanta, sono sorti due progetti con l'obiettivo di creare una tavola di codifica dei caratteri universale.
Uno è stato il progetto ISO 10646, l'altro il progetto Unicode[10], portato avanti da un consorzio di aziende produttrici di software. A partire dal 1991 le due organizzazioni, comprendendo l'inopportunità dell'esistenza di due progetti distinti per una tavola universale dei caratteri, hanno unito i loro sforzi ed hanno lavorato insieme per creare un'unica tavola dei caratteri. Entrambi i progetti esistono ancora e pubblicano i loro rispettivi Standard indipendentemente, comunque il consorzio Unicode e la ISO si sono accordati per tenere le tavole dei codici UCS[11] ed ISO 10646 standard e compatibili, inoltre si sono impegnati per coordinare ogni futura estensione.
Unicode 1.1 corrisponde ad ISO 10646-1:1993, Unicode 3.0 corrisponde ad ISO 10646-1:2000, e Unicode 3.2 corrisponde ad ISO 10646-2:2001.
Tutte le versioni di Unicode a partire dalla due, e quindi anche le rispettive tavole ISO 10646, sono compatibili, solo i nuovi caratteri vengono aggiunti, i caratteri esistenti non vengono rimossi o rinominati.
È da notare che le prime 256 posizioni dell'Unicode sono uguali a quelle della tavola Iso 8859-1 questo agevola la migrazione verso il nuovo sistema.
In origine nel progetto Unicode per aggirare i limiti delle tavole ad 8 bit si era pensato di creare una nuova tavola da 16 bit che avrebbe permesso ben 65.536 combinazioni, numero più che sufficiente per rappresentare tutti i caratteri delle lingue occidentali antiche e moderne, tuttavia non abbastanza capiente per accogliere, ad esempio, gli 80.000 simboli ideografici Han oppure le 11.000 sillabe coreane Hangul.
Oggi lo standard ISO10646/Unicode si basa su una codifica a 32 bit (in realtà per motivi tecnici sono solo 31 i bit utilizzati per definire le combinazioni) che consente oltre due miliardi di possibili caratteri, numero che dovrebbe essere decisamente sufficiente per realizzare una tavola di codifica dei caratteri veramente universale.
La versione 3.2 di Unicode definisce ben 95.221 caratteri comprendenti tutte le principali lingue occidentali con alfabeto latino, quelle slave ad alfabeto cirillico, l'ebraico, l'arabo nonché buona parte delle scritture africane, asiatiche ed indiane, tra le scritture comprese in Unicode vi sono anche il greco classico, oltre ovviamente quello moderno, ed il copto.
L'implementazione informatica di Unicode tuttavia comporta dei problemi, in particolar modo per quanto riguarda la crescita della dimensione dei files, per tal motivo sono stati creati dei charset detti UTF, Universal Character Set Transformation Format.
UTF usa una tecnica di bit-shifting (spostamento dei bit) per codificare i caratteri Unicode. In sostanza l'UTF usa 7 bit per carattere per codificare i primi 127 caratteri corrispondenti all'ASCII standard, e attiva l'ottavo bit solo quando serve la codifica Unicode. Ogni carattere Unicode viene quindi codificato con un numero variabile di byte[12] che va da 1 a 3. Il vantaggio è che il testo è visualizzabile con un normale editor di testi, anche se naturalmente i caratteri diversi dall'ASCII standard potrebbero apparire non correttamente. Per i testi comuni utilizzati in occidente consente di mantenere più compatte le dimensioni dei files rispetto ad UCS in quanto la maggior parte dei caratteri sono ASCII. Inoltre, l'UTF-8 attraversa indenne, come se fosse un normale testo, anche i sistemi e i programmi che non supportano Unicode. Per questi motivi l'UTF è molto usato nella posta Internet ed in alcuni sistemi operativi[13].
Tra le codifiche UTF la più comune è la UTF-8, che tra l'altro è la codifica di default di XML.
Codifica UTF-8
UTF-8 (Unicode Transformation Format, 8 bit) è una codifica dei caratteri Unicode in sequenze di lunghezza variabile di byte, creata da Rob Pike e Ken Thompson. UTF-8 usa gruppi di byte per rappresentare i caratteri Unicode, ed è particolarmente utile per il trasferimento tramite sistemi di posta elettronica a 8-bit.
UTF-8 usa da 1 a 4 byte per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell'alfabeto ASCII, corrispondenti alle posizioni Unicode da U+0000 a U+007F.
Quattro byte possono sembrare troppi per un solo carattere; tuttavia questo è richiesto solo per i caratteri che stanno fuori dalBasic Multilingual Plane, generalmente molto rari. Inoltre anche UTF-16 (la principale alternativa a UTF-8) richiede quattro byte per questi caratteri. Quale sia più efficiente, UTF-8 o UTF-16, dipende dall'intervallo di caratteri utilizzati, e l'uso di algoritmi di compressione tradizionali riduce in maniera significativa la differenza tra le due codifiche. Per brevi brani di testo, su cui gli algoritmi di compressione tradizionali non sono efficienti e una ridotta occupazione di memoria è importante si potrebbe utilizzare lo Schema di compressione standard per Unicode.
La IETF (Internet Engineering Task Force) richiede che tutti i protocolli Internet identifichino la codifica dei caratteri utilizzata, e che siano in grado di utilizzare almeno UTF-8.
UTF-8 viene descritto nello standard RFC 3629 (UTF-8, un formato di trasformazione dell'ISO 10646).
Brevemente, i bit che compongono un carattere Unicode vengono suddivisi in gruppi, che vengono poi ripartiti tra i bit meno significativi all'interno dei byte che formano la codifica UTF-8 del carattere.
I caratteri il cui valore unicode è inferiore a U+0080 vengono rappresentati con un singolo byte contenente il loro valore; essi corrispondono esattamente ai 128 caratteri ASCII.
In tutti gli altri casi sono necessari fino a 4 byte, ognuno di questi con il bit più significativo impostato a 1, in modo da distinguerli dalla rappresentazione dei caratteri dell'alfabeto ASCII a 7 bit, in particolare quelli il cui codice unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo.
Il grado più basso della codifica informatica dei testi è quindi la codifica dei caratteri.
Come abbiamo visto i computer sono in grado soltanto di trattare numeri in formato binario, affinché l'elaboratore sia in grado di operare con lettere o altri segni è necessario creare delle tabelle per la conversione dei numeri (bit) in caratteri (lettere, numeri, etc.), semplificando al massimo, possiamo dire che con queste tavole si assegna ad ogni carattere un numero.
Le tavole dei caratteri
Si suole parlare di character repertoire per l'insieme dei simboli che si vuol rappresentare, di code set per i codici numerici che fanno riferimento ai simboli delcaracter repertoire, l'insieme risultante di character repertoire e code set è dettocoded character set o charset; abitualmente i charset vengono rappresentati sotto forma di tabelle contenenti i simboli ed i rispettivi codici numerici, per questo motivo si suole parlare di tavole dei caratteri o code table.
Un piccolo esempio potrà aiutare a comprendere meglio quanto appena detto.
Allorché digitiamo sulla tastiera un tasto, per esempio la A maiuscola, mandiamo al computer un impulso elettrico, dei bit rappresentanti un numero binario, per la precisione nel caso della A maiuscola 1000001, il computer va a verificare nella propria tavola caratteri che il numero binario ricevuto corrisponde alla posizione 65 che a sua volta corrisponde al simbolo A, allora l'elaboratore preleva dal proprio repertorio di simboli grafici, "font", il glifo, ossia l'immagine del simbolo scelto, e lo manda a video. Lo stesso procedimento di corrispondenze fra numeri e simboli avviene allorquando apriamo un file contenente testo, tutti i codici numerici dei caratteri del file vengono tradotti nelle rispettive immagini grafiche e mandati in output.
È opportuna una precisazione, i caratteri contenuti nei charset non sono solo caratteri grafici, ma poiché un computer deve gestire non solo i cosiddetti caratteri "stampabili", ossia tutti quelli associati ad un simbolo grafico, ma anche istruzioni per la visualizzazione e le operazioni sui files, un carattere può anche, per esempio, rappresentare il comando di "a capo", il comando d'emissione di un segnale sonoro , o il segnale di inizio o di fine di un file; tali caratteri per lo più vengono usati nella trasmissione dati tra computers, o tra computer e stampante, e prendono il nome di caratteri di controllo; in genere ai caratteri di controllo vengono assegnate le prime 32 posizioni delle tavole dei caratteri.
Un po' di storia
Come detto, tutti i computer memorizzano il testo sotto forma di numeri. È tuttavia possibile che sistemi diversi memorizzino lo stesso testo utilizzando formati numerici differenti, e quindi possibile che il valore numerico che corrisponde ad un determinato carattere in un sistema , corrisponda a tutt'altro carattere in un altro; ad esempio in un computer che esegue Microsoft Windows utilizzando la tabella codici predefinita 1252 e in un computer Apple Macintosh che utilizza la tabella codici Macintosh Roman, la posizione 232 di queste tabelle dei caratteri corrisponde rispettivamente alla lettera è nel sistema Windows ed alla lettera Ëin quello Macintosh[8]. Quindi transitando da un sistema all'altro un documento contenente testo vedrebbe sostituite tutte le è conË.
Agli albori dell'era informatica il problema dell'incomunicabilità fra sistemi era assai diffuso. Ogni apparato informatico usava la propria tavola dei caratteri, spesso totalmente incompatibile con quella degli altri sistemi; si è parlato perciò di "babele informatica". Per cercare di ovviare a tutto questo, a partire dal 1963, un gruppo di studiosi tra cui Robert W. Bemer (considerato il padre dell'ASCII), si impegnarono nello sviluppo di un sistema di codifica standard per l'interoperabilità e l'interscambio di informazioni tra computers. Il lavoro di sviluppo culminò nel 1968 con l'approvazione da parte dell'ente nazionale americano per la standardizzazione (ANSI), che registrò come standard nazionale la tavola che prese il nome di American standard code for information interchange, meglio conosciuta come ASCII. (vedi tavola 1)
La tavola ASCII fa uso di sette bit per determinare i caratteri, cosicché sono solo 128 le posizioni possibili nella stessa (trattandosi ovviamente di tutte le combinazioni possibili di 0 e 1: 27 = 128).
Nel set ASCII, i primi 32 codici sono assegnati a caratteri di controllo, i restanti 96 codici sono assegnati ai segni d'interpunzione ed altri simboli, alle cifre da 0 a 9 e alle lettere dell'alfabeto latino, maiuscole e minuscole; mancano totalmente le lettere accentate di cui la lingua inglese non fa uso.
Nonostante tutto ciò, fu grande il successo di questa tavola, tanto che tutt'oggi è usata soprattutto per quanto riguarda le comunicazioni telematiche e la posta elettronica, e resta tuttora, praticamente, la sola universalmente condivisa da tutte le macchine.
Nel 1991 l'ISO[9] ha registrato, rendendola standard internazionale, la tavola ASCII col nome di ISO 646-IRV (International Reference Version).
Ben presto ci si rese conto, soprattutto da parte dei paesi non anglofoni, dell'inadeguatezza del charset ASCII per i testi scritti nella propria lingua madre. Si usavano vari espedienti per rappresentare le lettere accentate ed i vari simboli diacritici delle scritture occidentali, finché non si pensò di portare da 7 a 8 i bit della tavola ASCII, così il numero di caratteri disponibile divenne 256 (28 = 256), si ebbe in tal modo il cosiddetto ASCII esteso, che nelle varie versioni internazionali ospitava tutti quei caratteri non presenti nell'ASCII a 7 bit.
A partire dagli anni ottanta, soprattutto per opera della European Computer Manufacturer's Association (ECMA), sono stati rilasciati numerosi charset a 8 bit affinché fossero usati come standard per determinati gruppi di lingue, i quali furono successivamente recepiti dalla ISO e rilasciati come standard internazionali col nome di ISO 8859.
Particolarmente diffuso è il code set ISO 8859-1, meglio conosciuto come ISO Latin 1, dal nome della precedente tavola ECMA . Esso contiene i caratteri principali delle lingue occidentali e anglosassoni con alfabeti latini, ed è usato da molte applicazioni Internet, e da molti sistemi operativi. La dicitura "-1" sta ad indicare che si tratta della prima di una serie di tavole, ad esempio la ISO 8859-2 è invece usata per le scritture latine del centro e dell'est europeo; la più recente è la ISO 8859-15, la quale è uguale alla ISO 8859-1 con in più l'aggiunta del simbolo dell'euro .
Queste tavole sono costruite tutte in modo che per la prima metà garantiscono l'interoperabilità fra computers, così i primi 128 caratteri sono esattamente quelli di Iso 646 Irv; la seconda metà cerca di soddisfare, con altri 96 caratteri stampabili, le necessità di specifiche lingue o gruppi di lingue.
Prospettive future
Se le tavole ISO 8859 hanno rappresentato un importante passo avanti per quanto riguarda l'interscambio di comunicazioni soprattutto all'interno di uno stesso gruppo linguistico, tuttavia continuano a persistere problemi nella visualizzazione di testi rappresentati con differenti tavole dei caratteri. Per cercare di risolvere il problema della "Babele informatica", a partire dagli inizi degli anni ottanta, sono sorti due progetti con l'obiettivo di creare una tavola di codifica dei caratteri universale.
Uno è stato il progetto ISO 10646, l'altro il progetto Unicode[10], portato avanti da un consorzio di aziende produttrici di software. A partire dal 1991 le due organizzazioni, comprendendo l'inopportunità dell'esistenza di due progetti distinti per una tavola universale dei caratteri, hanno unito i loro sforzi ed hanno lavorato insieme per creare un'unica tavola dei caratteri. Entrambi i progetti esistono ancora e pubblicano i loro rispettivi Standard indipendentemente, comunque il consorzio Unicode e la ISO si sono accordati per tenere le tavole dei codici UCS[11] ed ISO 10646 standard e compatibili, inoltre si sono impegnati per coordinare ogni futura estensione.
Unicode 1.1 corrisponde ad ISO 10646-1:1993, Unicode 3.0 corrisponde ad ISO 10646-1:2000, e Unicode 3.2 corrisponde ad ISO 10646-2:2001.
Tutte le versioni di Unicode a partire dalla due, e quindi anche le rispettive tavole ISO 10646, sono compatibili, solo i nuovi caratteri vengono aggiunti, i caratteri esistenti non vengono rimossi o rinominati.
È da notare che le prime 256 posizioni dell'Unicode sono uguali a quelle della tavola Iso 8859-1 questo agevola la migrazione verso il nuovo sistema.
In origine nel progetto Unicode per aggirare i limiti delle tavole ad 8 bit si era pensato di creare una nuova tavola da 16 bit che avrebbe permesso ben 65.536 combinazioni, numero più che sufficiente per rappresentare tutti i caratteri delle lingue occidentali antiche e moderne, tuttavia non abbastanza capiente per accogliere, ad esempio, gli 80.000 simboli ideografici Han oppure le 11.000 sillabe coreane Hangul.
Oggi lo standard ISO10646/Unicode si basa su una codifica a 32 bit (in realtà per motivi tecnici sono solo 31 i bit utilizzati per definire le combinazioni) che consente oltre due miliardi di possibili caratteri, numero che dovrebbe essere decisamente sufficiente per realizzare una tavola di codifica dei caratteri veramente universale.
La versione 3.2 di Unicode definisce ben 95.221 caratteri comprendenti tutte le principali lingue occidentali con alfabeto latino, quelle slave ad alfabeto cirillico, l'ebraico, l'arabo nonché buona parte delle scritture africane, asiatiche ed indiane, tra le scritture comprese in Unicode vi sono anche il greco classico, oltre ovviamente quello moderno, ed il copto.
L'implementazione informatica di Unicode tuttavia comporta dei problemi, in particolar modo per quanto riguarda la crescita della dimensione dei files, per tal motivo sono stati creati dei charset detti UTF, Universal Character Set Transformation Format.
UTF usa una tecnica di bit-shifting (spostamento dei bit) per codificare i caratteri Unicode. In sostanza l'UTF usa 7 bit per carattere per codificare i primi 127 caratteri corrispondenti all'ASCII standard, e attiva l'ottavo bit solo quando serve la codifica Unicode. Ogni carattere Unicode viene quindi codificato con un numero variabile di byte[12] che va da 1 a 3. Il vantaggio è che il testo è visualizzabile con un normale editor di testi, anche se naturalmente i caratteri diversi dall'ASCII standard potrebbero apparire non correttamente. Per i testi comuni utilizzati in occidente consente di mantenere più compatte le dimensioni dei files rispetto ad UCS in quanto la maggior parte dei caratteri sono ASCII. Inoltre, l'UTF-8 attraversa indenne, come se fosse un normale testo, anche i sistemi e i programmi che non supportano Unicode. Per questi motivi l'UTF è molto usato nella posta Internet ed in alcuni sistemi operativi[13].
Tra le codifiche UTF la più comune è la UTF-8, che tra l'altro è la codifica di default di XML.
Codifica UTF-8
UTF-8 (Unicode Transformation Format, 8 bit) è una codifica dei caratteri Unicode in sequenze di lunghezza variabile di byte, creata da Rob Pike e Ken Thompson. UTF-8 usa gruppi di byte per rappresentare i caratteri Unicode, ed è particolarmente utile per il trasferimento tramite sistemi di posta elettronica a 8-bit.
UTF-8 usa da 1 a 4 byte per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell'alfabeto ASCII, corrispondenti alle posizioni Unicode da U+0000 a U+007F.
Quattro byte possono sembrare troppi per un solo carattere; tuttavia questo è richiesto solo per i caratteri che stanno fuori dalBasic Multilingual Plane, generalmente molto rari. Inoltre anche UTF-16 (la principale alternativa a UTF-8) richiede quattro byte per questi caratteri. Quale sia più efficiente, UTF-8 o UTF-16, dipende dall'intervallo di caratteri utilizzati, e l'uso di algoritmi di compressione tradizionali riduce in maniera significativa la differenza tra le due codifiche. Per brevi brani di testo, su cui gli algoritmi di compressione tradizionali non sono efficienti e una ridotta occupazione di memoria è importante si potrebbe utilizzare lo Schema di compressione standard per Unicode.
La IETF (Internet Engineering Task Force) richiede che tutti i protocolli Internet identifichino la codifica dei caratteri utilizzata, e che siano in grado di utilizzare almeno UTF-8.
UTF-8 viene descritto nello standard RFC 3629 (UTF-8, un formato di trasformazione dell'ISO 10646).
Brevemente, i bit che compongono un carattere Unicode vengono suddivisi in gruppi, che vengono poi ripartiti tra i bit meno significativi all'interno dei byte che formano la codifica UTF-8 del carattere.
I caratteri il cui valore unicode è inferiore a U+0080 vengono rappresentati con un singolo byte contenente il loro valore; essi corrispondono esattamente ai 128 caratteri ASCII.
In tutti gli altri casi sono necessari fino a 4 byte, ognuno di questi con il bit più significativo impostato a 1, in modo da distinguerli dalla rappresentazione dei caratteri dell'alfabeto ASCII a 7 bit, in particolare quelli il cui codice unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo.
|
|
Per esempio, il carattere alef (א), corrispondente all'Unicode U+05D0, viene rappresentato in UTF-8 con questo procedimento:
Riassumendo, i primi 128 caratteri vengono rappresentati con un singolo byte. I successivi 1920 ne richiedono due, e comprendono gli alfabeti Latino con diacritici, Greco, Cirillico, Copto, Armeno, Ebraico e Arabo. I restanti caratteri nel Basic Multilingual Planehanno bisogno di tre byte, tutto il resto di quattro.
Potenzialmente, UTF-8 sarebbe in grado di usare sequenze fino a 6 byte, coprendo l'intervallo da U+0000 a U+7FFFFFFF (31 bit), ma nel 2003 UTF-8 è stato limitato dallo standard RFC 3629 per coprire solo l'intervallo descritto formalmente nello standard Unicode, ovvero da U+0000 a U+10FFFF. In precedenza i soli byte che non potevano comparire in una sequenza UTF-8 valida erano 0xFE e 0xFF.
Con l'introduzione del precedente limite, il numero di byte non usati dalla codifica UTF-8 è salito a 13: 0xC0, 0xC1, e da 0xF5 a 0xFF. Anche se la nuova definizione di UTF-8 limita in modo consistente l'insieme di caratteri Unicode rappresentabili, il problema delle rappresentazioni multiple dello stesso carattere, un potenziale rischio per la sicurezza, scompare in quanto ognuna di queste sequenze conterrebbe uno dei byte non usati, risultando non valida.
In conseguenza dei meccanismi di funzionamento di UTF-8, le sequenze di byte godono di queste proprietà:
UTF-8 è stato progettato per soddisfare queste tre proprietà, in modo da garantire che nessuna sequenza di byte corrispondente a uno specifico carattere sia contenuta in una sequenza più lunga, usata per codificare un carattere diverso. Grazie a questa caratteristica la ricerca di parole o frasi all'interno di un testo può essere effettuata tramite confronto byte per byte; qualche precedente sistema di codifica basato su sequenze di lunghezza variabile di byte (per esempio Shift-JIS) non godeva di questa proprietà, rendendo gli algoritmi di confronto tra stringhe complicati. Nonostante si possa obiettare che questa caratteristica aggiunga ridondanza alla codifica del testo, i vantaggi sono maggiori degli svantaggi; inoltre la compressione dei dati non è uno degli scopi di Unicode, e va considerata separatamente. Infine, ancora grazie a questa proprietà, se uno o più byte andassero persi per errori di trasmissione o per corruzione dei dati, sarebbe possibile risincronizzare la decodifica all'inizio del carattere successivo, limitando i danni.
Vantaggi
Svantaggi
- ricade nell'intervallo da 0x0080 a 0x07FF. Secondo la tabella verrà rappresentato con due byte. 110xxxxx 10xxxxxx.
- l'esadecimale 0x05D0 equivale al binario 101-1101-0000.
- gli undici bit vengono copiati in ordine nelle posizioni marcate con "x". 110-10111 10-010000.
- il risultato finale è la coppia di byte 11010111 10010000, o in esadecimale 0xD7 0x90
Riassumendo, i primi 128 caratteri vengono rappresentati con un singolo byte. I successivi 1920 ne richiedono due, e comprendono gli alfabeti Latino con diacritici, Greco, Cirillico, Copto, Armeno, Ebraico e Arabo. I restanti caratteri nel Basic Multilingual Planehanno bisogno di tre byte, tutto il resto di quattro.
Potenzialmente, UTF-8 sarebbe in grado di usare sequenze fino a 6 byte, coprendo l'intervallo da U+0000 a U+7FFFFFFF (31 bit), ma nel 2003 UTF-8 è stato limitato dallo standard RFC 3629 per coprire solo l'intervallo descritto formalmente nello standard Unicode, ovvero da U+0000 a U+10FFFF. In precedenza i soli byte che non potevano comparire in una sequenza UTF-8 valida erano 0xFE e 0xFF.
Con l'introduzione del precedente limite, il numero di byte non usati dalla codifica UTF-8 è salito a 13: 0xC0, 0xC1, e da 0xF5 a 0xFF. Anche se la nuova definizione di UTF-8 limita in modo consistente l'insieme di caratteri Unicode rappresentabili, il problema delle rappresentazioni multiple dello stesso carattere, un potenziale rischio per la sicurezza, scompare in quanto ognuna di queste sequenze conterrebbe uno dei byte non usati, risultando non valida.
In conseguenza dei meccanismi di funzionamento di UTF-8, le sequenze di byte godono di queste proprietà:
- Il bit più significativo di ogni sequenza composta di un singolo byte è sempre 0.
- I bit più significativi del primo di una sequenza di più byte indicano la lunghezza della sequenza. Questi bit sono 110 per le sequenze di due byte, e 1110 per quelle di tre.
- I byte successivi al primo in una sequenza composta da più byte hanno sempre 10 come bit più significativi
UTF-8 è stato progettato per soddisfare queste tre proprietà, in modo da garantire che nessuna sequenza di byte corrispondente a uno specifico carattere sia contenuta in una sequenza più lunga, usata per codificare un carattere diverso. Grazie a questa caratteristica la ricerca di parole o frasi all'interno di un testo può essere effettuata tramite confronto byte per byte; qualche precedente sistema di codifica basato su sequenze di lunghezza variabile di byte (per esempio Shift-JIS) non godeva di questa proprietà, rendendo gli algoritmi di confronto tra stringhe complicati. Nonostante si possa obiettare che questa caratteristica aggiunga ridondanza alla codifica del testo, i vantaggi sono maggiori degli svantaggi; inoltre la compressione dei dati non è uno degli scopi di Unicode, e va considerata separatamente. Infine, ancora grazie a questa proprietà, se uno o più byte andassero persi per errori di trasmissione o per corruzione dei dati, sarebbe possibile risincronizzare la decodifica all'inizio del carattere successivo, limitando i danni.
Vantaggi
- Il vantaggio più ovvio di qualsiasi codifica UTF è che permette di rappresentare tutti i caratteri, a differenza di codifiche più vecchie.
- Alcuni caratteri di Unicode (per esempio l'alfabeto latino) occupano in UTF-8 un solo byte, altri richiedono fino a quattro byte. In generale un testo codificato in UTF-8 occuperà meno spazio del corrispondente UTF-16 o UTF-32 se contiene molti caratteri ASCII a 7 bit.
- Una sequenza di byte che codifica un carattere non può apparire come parte di una sequenza più lunga che codifica un altro carattere, come succedeva per codifiche a lunghezza variabile meno recenti (vedi la sezione precedente).
- Il primo byte di una sequenza è sufficiente a determinarne la lunghezza (è sufficiente contare il numero di bit più significativi con valore uno). Questo rende molto semplice estrarre una sotto-stringa da una stringa più lunga, senza bisogno di decodificare la sequenza di byte UTF-8
- La maggioranza del software esistente (inclusi i sistemi operativi) è stata scritta senza tener conto di Unicode, e l'uso di Unicode creerebbe problemi di compatibilità. Per esempio la libreria standard del C marca la fine di una stringa con un byte nullo (0x00). Usando UTF-16 il carattere Unicode "A" verrebbe codificato come 0x0041. Il primo byte verrebbe trattato come il marcatore di fine stringa, e il secondo e tutti i successivi verrebbero ignorati. UTF-8 è pensato in modo che nessuno dei byte codificati possa assumere uno dei valori speciali del codice ASCII, evitando questo e problemi simili.
- UTF-8 è la codifica predefinita per il formato XML.
Svantaggi
- UTF-8 usa sequenze di lunghezza variabile, cioè caratteri differenti vengono rappresentati con sequenze di byte di lunghezze diverse. La gravità del problema tuttavia potrebbe essere limitata creando un'interfaccia astratta che lavori con le stringhe UTF-8, e rendendola completamente trasparente all'utente. Inoltre anche UTF-16 usa sequenze di lunghezza variabile, anche se molti non lo sanno (o non sono interessati ai caratteri al di fuori del Basic Multilingual Plane).
- Un decoder mal programmato (e non conforme alle ultime versioni dello standard) potrebbe accettare diverse pseudo-codifiche UTF-8 e convertirle nello stesso carattere Unicode, scavalcando in questo modo eventuali controlli di sicurezza progettati per lavorare su rappresentazioni dei dati a 8 bit.
- Gli ideogrammi vengono rappresentati in UTF-8 con tre byte, mentre ne richiedono solo due in UTF-16. Di conseguenza i testi in Cinese / Giapponese / Coreano, oltre ad alcuni gruppi di caratteri Unicode meno noti, occupano più spazio quando vengono codificati con UTF-8.