Introduzione alla codifica dei caratteri

Questo testo è solo un’introduzione all’argomento della codifica dei caratteri. Per una maggiore comprensione consiglio di fare riferimento a spiegazioni più dettagliate, come questo articolo.

Per codifica dei caratteri si intende il metodo utilizzato per rappresentare un carattere.

In una codifica ogni carattere è associato ad un valore che lo identifica. Qui è riportata la tabella dei caratteri stampabili della codifica ASCII. Per esempio il carattere “A” è rappresentato dal numero 65 (0x41 in esadecimale), mentre il carattere “a” (minuscolo) è il numero 97 (0x61 in esadecimale). Ad esempio la stringa “Mondo” viene codificata con i seguenti valori decimali: 77, 111, 110, 100, 111.

La codifica ASCII prevede che ogni carattere occupi un solo byte. Inoltre, per ragioni storiche, sono utilizzati solo 7 bit del byte. Per questo in totale è possibile rappresentare solo 128 caratteri (da 0 a 127). Inizialmente i 128 caratteri erano sufficienti, ma con il tempo si è sentita la necessità di includere altri caratteri, per supportare anche lingue diverse dall’inglese. Per esempio l’italiano prevede l’utilizzo delle accentate.

La prima idea implementata dai produttori di software per ampliare la codifica è stata quella di utilizzare gli altri 128 valori rappresentabili con l’ottavo bit. Purtroppo non si è affermato uno standard, ed ognuno ha “esteso” ASCII a modo suo. Inoltre 256 valori sono comunque pochi per rappresentare i caratteri necessari per tutte le lingue. Sono quindi nate tante codifiche diverse, una per ogni lingua e/o per ogni produttore, tutte identiche ad ASCII fino al 128° carattere, e diverse per i successivi.

Un esempio sono le codifiche della “famiglia” 8859 di cui le più utilizzate sono la Latin-1 (ISO-8859-1) e la Latin-9 (ISO-8859-15), oppure la codifica ideata da Microsoft, la Windows-1252.

Successivamente, dal lavoro di Ken Thompson e Rob Pike sul sistema operativo Plan 9, è nata la codifica UTF-8. UTF-8 ha la caratteristica di essere una codifica multi-byte, ovvero può utilizzare più di un byte per rappresentare un singolo carattere. I primi 256 valori sono rappresentati con un solo byte, ma i successivi possono arrivare a concatenare fino a 4 byte, per un totale di più di 4 miliardi di simboli. Gli ideatori hanno reso la codifica identica bit a bit ad ASCII fino al 128° carattere, per cui una stringa codificata in ASCII è effettivamente una stringa UTF-8 valida.

E’ importante non confondere UTF-8 con il progetto Unicode. Mentre la prima è un metodo di rappresentazione delle informazioni, il secondo è un progetto che si pone l’obiettivo di definire una mappatura standard tra valori numerici (detti code point) e caratteri (o meglio, simboli). Una codifica non è solo un mapping tra numeri e simboli, ma anche (e soprattuto) il modo in cui i valori sono rappresentati nella memoria. Per fare un’analogia, è come parlare della differenza tra la rappresentazione in complemento a uno e in complemento a due, oppure tra big endian e little endian. Sono diversi modi per rappresentare lo stesso valore.

Esistono anche altre codifiche multi-byte basate su Unicode, come UTF-16, ma in generale UTF-8 è la più usata, specialmente su Internet.

Se sei interessato alla gestione della codifica dei caratteri in Java, leggi anche questo articolo.