la codifica dei caratteri

Girando per il web spesso capita di imbattersi in pagine che presentano dei caratteri in modo errato, soprattutto lettere accentate e altri simboli.
Ciò è dovuto ad una errata interpretazione dei caratteri che, partendo dal documento originale, arrivano al nostro browser.

Questo può succedere per vari motivi ma per diagnosticare e risolvere il problema occorre capire a fondo l’argomento.

Il bit è l’unità elementare di memorizzazione in un computer, 8 bit sono 1 Byte, che può rappresentare 256 valori differenti.
Le CPU dei primi Personal Computer che si andavano diffondendo a partire dagli anni 80 avevano per la stragrande maggioranza un bus dati a 8 bit, per cui l’unità minima di immagazzinamento erano parole a 8 bit ovvero di un byte.

Con un byte, come dicevo prima, si possono rappresentare 256 valori diversi, ovvero i numeri interi positivi da 0 a 255, oppure, usando il complemento a 2, i numeri interi da -127 a + 128.

Valori troppo poco estesi per la maggior parte degli impieghi scientifici/finanziari, per cui da subito sono state inventate delle codifiche per rapprentare degli intervalli di numeri più estesi, basate sull’utilizzo di più byte.
Il concetto è che per rappresentare un numero si utilizzano più byte, per esempio 4 oppure 8 nel caso dei numeri in floating point ( virgola mobile ) codificati con lo standard IEEE 754.

Il byte deve invece esser sembrato da subito più che sufficiente per contenere un carattere, essendo i caratteri da rappresentare solamente quelli inglesi e non essendosi posti inizialmente il problema della localizzazione.

Da qui nacque, nei primi anni 60, la codifica US-ASCII.
In realtà la codifica US-ASCII usa solo 7 degli 8 bit che mette a disposizione il byte e dei 128 valori differenti per i caratteri ne sono utilizzati 26 per le maiuscole, 26 per le minuscole, 10 per le cifre dei numeri e tutti i rimanenti per caratteri tipo +, – e altri caratteri di controllo.
Per fare un esempio, il valore 65 (41 esadecimale) rappresenta la lettera “A”.

Con la diffusione dei Personal Computer nel mondo è stato chiaro da subito che con la codifica ASCII non si potevano rappresentare lettere con accenti, apostrofi, circonflessi, per non parlare del cirillico etc…

Ecco quindi nascere l’ ISO 8859, che usa tutti gli 8 bit del byte per rappresentare i simboli presenti in altre lingue.

Con l’ ISO 8859 si possono rappresentare 128 caratteri addizionali rispetto all’ US-ASCII.

Non sufficienti, però, a rapprentare la totalità dei simboli presenti in tutte le lingue, per cui sono state introdotte delle varianti per cui lo stesso byte potrebbe rappresentare un carattere diverso.

Per fare un esempio, il valore 232 (E8 esadecimale) rappresenta, nella codifica ISO_8859_1, il carattere “è” mentre, nella codifica ISO_8859_2, il carattere “č”.

Parallelamente si sviluppano altre codifiche come Windows-1252, etc…

Dato un documento quindi se non si sa qual’è la codifica con la quale è stato scritto si rischia di vedere i famosi “caratteracci”.

Insomma una babele di codici ognuno con uno o più alias, per fortuna qualcuno si è preoccupato di creare una codifica che assegnasse un numero univoco ad ogni carattere o simbolo, tale codifica si chiama appunto Unicode.

Inizialmente il codice Unicode prevedeva 16 bit, ma si è arrivati ad oggi fino a 21 bit per rappresentare un carattere.

Con l’Unicode si possono rappresentare circa un milione di caratteri/simboli, per la vastità dei simboli rappresentati basta andare sulla pagina Code Charts su unicode.org.

Fisicamente i caratteri Unicode vengono serializzati in byte usando le codifiche UTF-8, UTF-16 e UTF-32, la codifica UTF-8 è la più diffusa.

Per identificare un carattere unicode si può utilizzare la notazione U+ le 4 o sei cifre del codice esadecimale che lo rappresenta.
Es.
U+0041 rappresenta la lettera A, mentre U+03A9 rapprenta la lettera greca omega.

Tanto per tornare al discorso iniziale sui numeri, l’ Unicode sta all’UTF-8 come il float sta all’ IEEE 754.
I numeri in virgola mobile e i caratteri Unicode sono entità che vengono serializzate in byte usando delle codifiche, IEEE 754 per i numeri e UTF-8 per i catatteri.

Ora che sappiamo tutto su simboli e sistemi di codifica abbiamo più elementi per capire qual’è il problema dei caratteracci nelle pagine web.

Per evitare problemi andrebbe sempre usata la codifica UTF-8, premesso ciò vediamo come analizzare i problemi.

Partiamo dalla nostra pagina che presenta i caratteracci: visualizziamo il sorgente della pagina e vediamo se è presente il tag meta con l’ attributo http-equiv che specifica il charset.
Es.
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
Il charset dice al browser con quale charset è codificata la pagina.

Se manca questo tag ?

Andiamo a vedere cosa risponde il server quando chiediamo la pagina, per capire meglio di cosa si parla occorre conoscere il protocollo HTTP, per brevità quello che qui mi limito a dire è che, quando il browser chiede una pagina html a un server, quest’ultimo risponde con un pacchetto di informazioni iniziali, chiamato HTTP response message, che dovrebbe contenere, tra le altre cose, le informazioni sul charset utilizzato.
Per visualizzare tali informazioni si possono utilizzare delle estensioni di Firefox come LiveHttpHeaders o HttpFox.

Nel pacchetto di risposta dovremmo vedere una linea come questa:
“Content-Type: text/html; Charset=UTF-8”
Che indica che la pagina è appunto codificata usando l’UTF-8.

Se non è presente il charset, il default è l’ ISO-8859-1

E’ chiaro che, se presente, il tag http-equiv non deve essere in disaccordo con quanto ricevuto nell’header di risposta http, in quanto se lo fosse il browser sarebbe in dubbio nell’interpretare il charset, in tal caso inoltre browser diversi potrebbero scegliere codifiche diverse e portare a siti che vanno “solo con Firefox” o “solo con Explorer”…

OK se l’header o il tag sono a posto ?
Probabilmente il documento html sul server è stato salvato con un charset differente da quello comunicato dal server al client, probabilmente non abbiamo detto all’editor il charset con cui salvare il documento o abbiamo lasciato il suo default che è sbagliato.

Se la pagina html è generata dinamicamente, per esempio prelevando i dati da una tabella in un database, probabilmente questa tabella è stata creata con il charset sbagliato e così via….

Quello che raccomando è usare SEMPRE l’ UTF-8 per rappresentare caratteri e configurare tutte le componenti del server in modo che lavorino con questo formato.

Riferimenti

  • No Related Post