Unicode - breve storia
[...]
Per iniziare bisogna partire dai cosi detti set di caratteri (o repertorio di caratteri) che è l’insieme di caratteri che alcune lingue utilizzano per scrivere. Per capire meglio la lingua italiana usa l’alfabeto (a-z), più lettere accentate (àèéùìò) e segni di interpunzione ( , : . ! ; - ? ). Ogni lingua dispone di un set di caratteri che può essere comune anche ad altre lingue, integralmente o parzialmente. Questo aspetto ha creato non pochi problemi ai tipografi e, con l’entrata della new technology nella vita quotidiana, anche ai programmatori. Per riprodurre i set di caratteri era necessario disporre di una codifica (encoding) che è la regola matematica che permette di calcolare un codice (numero) corrispondente a ogni carattere. Per i non addetti ai lavori, questo si traduce in una tabella che indica il codice abbinato a ogni carattere (o grafema). Questo significa che il codice assegnato ad una lettera in maiuscolo (ad esempio ‘N’) è diverso da quello assegnato alla stessa lettera in minuscolo (‘n’).
E’ necessario fare un piccolo passo indietro per ricordare cos’è il bit. In informatica, il bit è l'unità minima di informazione. Con un solo bit possiamo rappresentare solo due codici, con due possiamo rappresentarne 4. Ma l'unità minima significativa è rappresentata, normalmente, da un gruppo di 8 bit (byte), perciò in una tabella encoding che utilizza 8 bit, ci saranno fino a 256 caratteri differenti. Va da sé che se un encoding utilizza più byte, potrà rappresentare un maggior numero di caratteri. Questo concetto è legato al set di caratteri: il sistema ASCII utilizza un solo byte, Unicode utilizza due, mentre UTF-8 ne utilizza un numero variabile (da uno a sei).
Per capire meglio come si è arrivato alla codifica Unicode bisogna partire dal codice ASCII (American Standard Code for Information Interchange) che è un codice binario standard americano per scambio di informazioni, ideato da Robert W. Bemer nel 1965 e approvato nel 1968 da ANSI (Istituto Nazionale Americano per gli Standard). Inizialmente i computer ‘parlavano’ solo americano, perciò il codice ASCII doveva rappresentare il set di caratteri americani: caratteri numerici (0123456789), alfabetici maiuscoli e minuscoli, punteggiatura, simboli grafici e 32 codici per il controllo di periferiche e apparecchi di comunicazione (caratteri non stampabili). I primi codici stabiliti da ANSI erano di 128 caratteri in totale, in quanto lo riteneva più che sufficiente, malgrado ne aveva a disposizione 8 bit (1 byte), cioè 256 codifiche differenti. Questa scelta significa che nella codifica ASCII sono utilizzati solo 7 degli 8 bit a disposizione, lasciando il bit a sinistra, considerato il più significativo, sempre a zero. Questa tabella divenne così uno standard, codificata, nel 1991, anche da ISO (standard ISOIEC 646:1991), uno standard ancora oggi ampiamente utilizzato.
La scelta progettuale più importante di Unicode fu che ogni carattere doveva occupare 16 bit. Un byte da 8 bit, con le 256 combinazioni disponibili, non poteva bastare ma, allo stesso tempo, i progettisti di Unicode volevano evitare l’architettura complicata e fragile delle codifiche dell’Estremo Oriente, dove il codice dei caratteri è formato da un numero variabile di byte. Un’unità di memoria da 16 bit permette di avere 65.536 combinazioni diverse che, espresse in cifre esadecimali, vanno da 0 a FFFF e questo numero pareva perfettamente adeguato agli scopi di Unicode: la versione 1.0 dello standard utilizzava poco meno della metà delle combinazioni, ma includeva già quasi la totalità delle scritture moderne, inclusi gli oltre i ventun mila caratteri cinesi. Le altre scritture ancora mancanti erano tutte fonetiche e non richiedevano più di qualche decina di caratteri ognuna. Questo significava che rimaneva ancora tantissimo spazio, dove si riteneva che potessero trovare posto le principali scritture antiche, dalle rune ai geroglifici egizi. Ma tali calcoli si sono rivelati errati. Lo spazio rimanente non era sufficiente per tutte le scritture antiche e solo il numero dei caratteri cinesi rari e antichi era di molto superiore alle aspettative. Ciò fu ancora più evidente quando gli istituti di standardizzazione di Cina, Giappone e Corea indicarono altri cinquanta mila nuovi caratteri, perché l’architettura a 16 bit non poteva soddisfare un numero così elevato. Per poter mantenere l’idea di partenza che ogni carattere dovesse occupare un numero fisso di bit, la successiva unità di memoria utile sarebbe stata quella da 32 bit (doppia word o long integer), che aumenta il limite delle codifiche oltre i quattro miliardi di caratteri. Benché fosse una soluzione molto interessante per certi aspetti, per altri fu considerata eccessiva: caratteri di 32 bit (cioè di quattro byte) significava dover raddoppiare la dimensione di tutti i documenti scritti nelle lingue dell’Estremo Oriente e quadruplicare la dimensione di quelli del resto del mondo. Altro aspetto degno di nota fu che a metà degli anni ’90 Unicode era largamente usato in molti prodotti software e un tale cambiamento avrebbe reso inutilizzabile questi software e investire nella riscrittura di questi software.
Unicode propone una soluzione: UTF-16 (16 bit Unicode transformation format) nel tentativo di arginare questi enormi inconvenienti. Si decise di riservare 1.024 codici, detti surrogati alti (high surrogates) e altrettanti detti surrogati bassi (low surrogates). Ogni possibile sequenza formata da un surrogato alto seguito da uno basso codificava un cosiddetto carattere surrogato: diventava dunque possibile codificare 1.024 × 1.024 nuovi caratteri, cioè 1.048.576. Questo nuovo totale di nuovi codici è stato suddiviso in 16 piani da 65.536 codici ognuno. I 65.536 caratteri dell’Unicode a 16 bit si chiamano ora piano zero o BMP (Basic Multilingual Plane); i rimanenti 16 piani sono numerati da 1 a 16 e si chiamano piani estesi o piani surrogati. I codici dei piani estesi, espressi in cifre esadecimali, vanno da 10000 a 10FFFF. Il sistema dei codici surrogati implica però che i caratteri Unicode non sono più di dimensione fissa: alcuni caratteri richiedono una word da 16 bit e altri ne richiedono due. Questa soluzione ha però attirato molte critiche, in quanto tradisce l’originario principio stabilito da Unicode relativa ai caratteri a lunghezza fissa e ripristina le codifiche a doppio byte, che erano appena state bocciate. La soluzione che poteva bilanciare questa situazione, vale a dire l’uso delle codifiche a lunghezza variabile, fu quella di recuperare come unità fondamentale il vecchio byte da 8 bit.
Nel 1996, François Yergeau, un progettista della Alis Technologies, presentò una request for comments destinata a fare strada: RFC 2044 – UTF-8, a transformation standard for ISO 10646 (le RFC sono i documenti con i quali si propone formalmente l’adozione di un nuovo standard per Internet). L’UTF-8 è un codice multibyte che permette di rappresentare tutti i caratteri di Unicode in un formato compatibile con l’ASCII e, dunque, con molti dei vecchi programmi non abilitati ai caratteri da 16 bit. L’UTF-8 rappresenta i 128 caratteri compresi nel vecchio codice ASCII con un singolo byte; tutti gli altri valori sono rappresentati con sequenze lunghe da due a sei byte, per un totale di oltre due miliardi di codici diversi: ben più di quanto necessario a Unicode. Questo non è però l’unico vantaggio rispetto alle vecchie codifiche a doppio byte dell’Estremo Oriente: l’UTF-8 è progettato in modo tale da essere stateless, cioè un eventuale errore su un byte interessa solo il carattere codificato con quel byte e perciò non è possibile che l’errore si propaghi ai caratteri che seguono, rendendo così inutilizzabile l’intero testo. L’idea alla base dell’UTF-8 era talmente buona che fu subito adottato come secondo UTF ufficiale e oggi è diventato la forma più comune di Unicode: le e-mail e le pagine web in Unicode utilizzano prevalentemente l’UTF-8.
All’UTF-8 e all’UTF-16 si è aggiunto recentemente l’UTF-32 il quale, utilizzando doppie word da 32 bit, recupera l’antica semplicità dei caratteri a dimensione fissa, ma costituisce un enorme spreco di spazio. Per questo motivo l’UTF-32 è utilizzato prevalentemente come formato interno dei programmi che rende più tollerabile lo spreco in quanto riguarda solo quel poco testo che il programma sta elaborando in un certo momento, mentre per la parte di salvataggio e scrittura sul disco sarà impiegato un UTF più compatto.
Nel 1998 nacque lo standard ISO 8859. Lo standard ISO 8859 è che un'estensione della tabella ASCII, alla quale sono stati aggiunti i 128 codici ottenibili con l'utilizzo dell'ottavo bit (non utilizzato da ASCII). Lo scopo di ISO 8859 era quello di rappresentare i simboli grafici dei caratteri propri delle lingue europee, infatti esso fu creato da ECMA (European Computer Manufacturer's Association) e solo successivamente ricevette l'appoggio di ISO. Fu però presto evidente che non era possibile rappresentare tutte le varianti possibili contenute nei diversi set di carattere europei con l'aggiunta di un solo bit (avendo quindi a disposizione 128 codifiche ). La strada che venne quindi scelta fu quella di istituzionalizzare e standardizzare tabelle di caratteri differenti per ciascuna area geografica che condividesse un set di caratteri, comprese aree geografiche extraeuropee, dando vita a differenti versioni dello standard ISO 8859.
Lo standard internazionale ISO 10646 (ISOIEC 10646:2003 Universal Multiple-Octet Coded Character Set) definisce UCS (Universal Character Set) che è un superset di caratteri che comprende tutti i set di caratteri standard, garantendo una compatibilità bidirezionale con gli altri set di caratteri. Unicode costituisce l'implementazione ufficiale dello standard internazionale ISOIEC 10646 e può codificare più di un milione di caratteri. I vantaggi rappresentati da questo standard sono molteplici in quanto consente che un'unica versione di un software o di un sito web siano fruibili con piattaforme e lingue diverse; evita la necessità di soluzioni custom per ogni situazione specifica; permette la fruizione del testo fra sistemi operativi diversi senza che abbia luogo alcuna corruzione dei dati.
Unicode assegna un valore numerico (code point) e un nome a ciascuno dei suoi caratteri. I termini che definiscono questa operazione complessa sono: code space: l'intervallo numerico utilizzato per codificare i caratteri; code point (o carattere o Unicode scalar value): un singolo numero intero all'interno di questo intervallo; encoded character: l’assegnazione del carattere a un determinato code point all'interno del codespace; code units: i computer gestiscono i numeri come combinazioni di unità a grandezza fissa (code unit), quali il byte (composto da 8 bit) o la word (composta da 32 bit). Con il termine code unit si definisce la quantità minima di bit che può rappresentare una unità. In un sistema che assume una code unit di 8 bit, per esempio, potrà essere rappresentato un insieme numerico compreso nell'intervallo 0 - 255 (o qualsiasi altro intervallo, ma la quantità massima dei componenti di quell'insieme non potrà essere mai superiore a 256). In un sistema che assume una code unit di 16 bit, l'intervallo dei numeri rappresentabili si estende di conseguenza e cosi via.
Le forme di rappresentazione sviluppate da Unicode, le così dette encoding forms (modelli di codifica) sono dei code point (numero intero destinato a rappresentare un carattere) che utilizzano tre differenti code unit. Le tre encoding forms attualmente implementate da Unicode sono chiamate UTF (Unicode Transformation Format) oppure UCS. Ciascuna di queste tre encoding forms è da considerarsi un meccanismo legittimo per rappresentare i caratteri Unicode; ognuna di esse ha i propri vantaggi in contesti differenti. Ciascuna delle tre encoding forms di Unicode può essere trasformata in ciascuna delle due rimanenti in modo efficiente e senza alcuna perdita di dati.
Le tre encoding forms previste da Unicode sono:
- UTF-32, con una code unit di 32 bit ed è la più semplice encoding form di Unicode. Ciascun code point è rappresentato direttamente da una sola code unit a 32 bit. Per questo si considera che UTF-32 è una encoding form a grandezza fissa (32 bit) e che ha corrispondenze uno-a-uno tra carattere codificato e code unit
- UTF-16, con una code unit di 16 bit (chiamata word o short integer), che è quella che utilizza i code point surrogati, è il diretto discendente del primo Unicode, quello originariamente strutturato ad utilizzare esclusivamente una encoding form a grandezza fissa (16 bit)
- UTF-8, con una code unit di 8 bit è una encoding form a grandezza variabile che assegna un code point a una sequenza di byte (o code unit, che in UTF-8 sono a 8 bit ) composta da un numero variabile di byte (da uno a quattro), in cui i bit più significativi di ciascun byte (quindi, di ciascuna code unit ) indicano il posto occupato dal byte (quindi dalla code unit) all'interno della sequenza stessa.
Unicode è il set di caratteri codificati, dove ogni carattere (o metacarattere) è assegnato ad un code point unico (salvo pochissime eccezioni dovute a problemi di compatibilità con versioni precedenti), mentre UTF-8, UTF-16 e UTF-32 sono tre encoding forms, ovvero tre forme differenti di distribuzione dei bit studiate per rappresentare tutti i code point di Unicode. UTF-8 ( come UTF-16 e UTF-32 ) è una modalità di rappresentazione di tutti i code point contenuti nella tabella Unicode. Lo standard ISO 8859 è stato progettato per un affidabile scambio di informazioni, non per la stampa tipografica; lo standard omette quindi simboli necessari per una stampa di qualità, come le legature opzionali, le virgolette, le lineette e altri caratteri. Per questo motivo i sistemi tipografici professionali spesso usano estensioni proprietarie (spesso incompatibili tra di loro) aggiunte all'ASCII e allo standard ISO 8859, oppure l'Unicode.
Se desiderate sapere di più:
http://unicode.org/standard/translations/italian.html (pagina in italiano)
http://unicode.org/charts/ (tabelle codici delle lingue codificate)











