Unicode e le codifiche [ITA]

Introduzione

Più volte mi è accaduto di tornare sul tema delle codifiche, di Unicode, ma il mondo informatico è ancora lontano dall'essersi adeguato allo standard Unicode per cui spesso le persone si perdono in un bicchier d'acqua. Ho deciso di stilare perciò questa breve introduzione sperando di ridurre l'incidenza di problemi e di ripetermi meno frequentemente.

Cos'è Unicode

Unicode è lo standard con cui codificare del testo; come recita il primo capitolo «The Unicode Standard is the universal character encoding scheme for written characters and text» (il corsivo è mio). D'altronde se vedete le doppie virgolette significa che il vostro browser è correttamente configurato per vedere i codice Unicode U+00AB e U+00BB.

La realtà è che Unicode non è ancora così pervasivo e in un sacco di situazioni ci si trova ad avere a che fare con altre codifiche. Una codifica è l'associazione tra un carattere e il numero (o i numeri) che lo rappresentano elettronicamente, se vogliamo è una funzione dallo spazio dei caratteri allo spazio dei numeri naturali. Un carattere è un simbolo (in generale) stampabile con significato fonetico o ideografico. Lo stesso carattere è quasi sempre associato a numeri diversi in codifiche diverse. Ad esempio in MS-DOS (in particolare le code page 437 e 850) la lettera e con l'accento acuto (é) è codificata con il numero 130 mentre in Windows (code page 1252) ha il numero 233. All'inverso il numero 133 codifica la lettera a con l'accento grave (à) in MS-DOS ma in Windows codifica i puntini di sospensione ( ).

La ragione di questo è che in passato i sistemi erano abbastanza isolati l'uno dall'altro e le memorie e i canali di trasmissione erano risorse preziose per cui l'impiego di un solo byte per codificare i caratteri di un gruppo linguistico e gestire nei programmi e nei metadati l'indicazione della codifica utilizzata era un gioco che ripagava. Poi è arrivata Internet, la gente si scambia documenti, la memoria costa poco, e così si arriva a Unicode.

Unicode risolve le complessità di sapere quale codifica è in uso perché, a tendere, sarà l'unica codifica utilizzata.

Un pasticcio reale

Immaginiamo di digitare questo testo

 <?xml version="1.0" encoding="UTF-8" ?>
<Books>
  <Book>The Programmers ABC</Book>
  <Book>Attività Commerciali</Book>
</Books>

in notepad

e salvarlo. Aprendolo in Internet Explorer, con un doppio click, non ci si aspetta di vedere questo errore:

In cosa abbiamo sbagliato? Nella fretta non abbiamo indicato la codifica da usare e notepad ci propone per default ANSI

che in realtà corrisponde ad usare la code page configurata per l'utente. Nel mio caso è Windows-1252. Il browser legge i primi 40 byte del file e trova scritto UTF-8. Ne consegue che tutti i parser Xml, leggendo l’intestazione, penseranno di trovarsi davanti a dati codificati in UTF-8 ossia in Unicode.

 L'operazione corretta da fare è di specificare nella finestra di salvataggio una codifica coerente con l'intestazione Xml

 

Stavolta il browser (o più esattamente il parser MSXML) è felice. In alternativa basta apporre come intestazione l’encoding corretto, cioè Windows-1252

 

Nel nostro caso il problema sorgeva dal fatto che i dati sono codificati in un modo, mentre la dichiarazione iniziale (processing instruction) ne indica uno differente. 
Qual è la differenza? Basta osservare i due file con un editor binario

 

La à viene rappresentata daun solo byte 0xE0 in Windows-1252 e dai due byte 0xC3 0xA0 in UTF-8.
 
Notepad è in grado di gestire benissimo l’UTF-8 tanto è vero che ha aggiunto il Bye Order Mark all’inizio del file, ossia i 3 byte 0xEF 0xBB 0xBF, per indicare che il contenuto è UTF-8 come previsto dallo standard Unicode.

Che cos'è questo UTF-8?

È una delle rappresentazioni di Unicode. Unicode vuole essere la codifica universale e includere tutti i possibili caratteri di tutte le lingue in uso, delle lingue morte, di altre notazioni scientifiche o musicali. A oggi Unicode 4.1 definisce oltre 97.000 diversi caratteri. Ad ogni carattere è associato un numero naturale che può essere rappresentato in diversi modi. La rappresentazione oggi più naturale consiste nell'utilizzare un intero a 32 bit, la cosiddetta UTF-32, ma se il testo è composto da caratteri latini si sprecano 3 byte per ciascun carattere. Ecco che allora si sono inventate altre due rappresentazioni più pratiche. La prima, UTF-8, è la più adatta alla nostra lingua e usa un numero variabile di byte da 1 a 4. UTF-16 usa invece un numero variabile di word a 16 bit, questa è la rappresentazione usata internamente a Windows: (quasi) ogni volta che la documentazione Microsoft indica Unicode, si riferisce in realtà ad UTF-16.

Lo standard Xml si appoggia a Unicode e ha UTF-8 come default. Difatti il nuovo standard XML 1.1 ha rivisto una serie di problemi legati all'evoluzione di Unicode e ad alcune incongruenze tra i due standard.