Unicode � bello

Ai tempi dei Sumeri, scrivere il testo era piuttosto complicato. Per copiare i tremila versi dell’epopea di Gilgamesh ci voleva almeno una settimana. Insomma, chi la copiava violando il diritto d’autore si meritava anche un ringraziamento, visto tutto lo sforzo necessario. Poi sono arrivati altre forme di scrittura e, soprattutto, altri supporti. La carta e la pergamena in particolare, sulle quali si è passati dai geroglifici ai caratteri greci e latini, passando per tutta una serie di altri codici di scrittura. La carta è diventa il supporto principale per la scrittura grazie all’invenzione della stampa, e lo è rimasta fino a pochi decenni fa. L’arrivo dei computer ha segnato una nuova era: i testi, ormai, si memorizzano in formato digitale, su memorie magnetiche o di silicio. I caratteri sono ancora importanti, perché vengono visualizzati sugli schermi e permettono a noi umani di leggere il testo, ma per i computer un carattere non è altro che un numero. Bisogna quindi avere una tabella per assegnare un numero a ogni carattere. Per fortuna, fin dagli anni ‘60 tutti i costruttori di computer nel mondo si sono accordati per seguire un unico standard internazionale. Il problema è che avevano promesso di adottare un sistema unificato solo quando i maiali avrebbero volato, oppure quando il presidente russo sarebbe stato visto a Washington, ubriaco, a chiamare un taxi per ordinare una pizza. E nel frattempo ciascuno inventava il proprio sistema di codifica. Poi, negli anni ‘90 finalmente una delle condizioni si è avverata (no, i maiali non volano, non ancora). Forse è andata così.
O forse non avevano nemmeno pensato di mettersi d’accordo negli anni ‘60, e l’evento che ha convinto i costruttori di computer a trovare uno standard condiviso è stato l’avvento del web. In effetti, il web ha permesso agli utenti di leggere enormi quantità di pagine scritte in ogni parte del mondo, ciascuna con lingue e caratteri diversi. Si, questa opzione sembra più probabile. Comunque vada, all’inizio degli anni ‘90 la codifica più comune era l’ASCII, usata da IBM sui computer di lingua inglese. La codifica era intelligente, perché la numerazione delle lettere iniziava da 65. In formato binario, il numero 65 è 01000001, quindi le lettere maiuscole sarebbero

A = 01000001
B = 01000011
Z = 01011010

mentre le lettere minuscole iniziavano da 97:

a = 01100001
b = 01100011
z = 01111010

Tutte le lettere con diacritici andavano dal 128 in poi (cioè da 10000000). In altre parole, controllando i primi tre bit da sinistra si poteva immediatamente capire se la lettera fosse maiuscola, minuscola, o con accento e altri simboli.
Il nuovo consorzio per la codifica universale, chiamato Unicode, aveva deciso di essere retrocompatibile, quindi le lettere dell’alfabeto latino vennero mantenute con i valori ASCII. Il problema è che usando un solo byte (8 bit in sequenza) è possibile rappresentare un massimo di 256 numeri. Quindi per codificare le migliaia di simboli inventati dall’umanità, inclusi tutti gli ideogrammi cinesi, servono ben più di 8 bit: almeno 32, quindi 4 byte.
Sarebbe stato assurdo prevedere un totale di 32 bit per ogni carattere anche quando si possono usare numeri molto più piccoli, ogni file di testo che usa soltanto caratteri ASCII finirebbe per occupare ben 4 volte tanto.
C’era anche un altro problema: nella gestione dei testi esiste il byte null, cioè un byte con valore 0. In altre parole, una sequenza di otto bit con valore zero. Quando un programma leggere del testo e trova questa sequenza, si ferma perché è il simbolo che indica la fine del testo. Quindi non si può creare nessuna sequenza di bit Unicode che contenga 8 zeri consecutivi.

Fino agli anni ‘90, ogni produttore inventava il proprio sistema di codifica dei caratteri. Unicode si è aggiunto come ulteriore standard, ma finalmente sta sostituendo gli altri
Fonte: xkcd, Randall Munroe

La soluzione venne trovata da Ken Thompson e Rob Pike, per il loro sistema operativo Plan 9 from Bell Labs. Thompson è anche famoso come autore, assieme a Ritchie, del sistema Unix. E si chiama UTF-8. La codifica UTF-8 è una idea intelligente, perché utilizza una convenzione standard per indicare il numero di byte (da 1 a 4) usati per rappresentare i caratteri.
Per i caratteri ASCII semplici (quindi fino a 127) si userà un solo byte, che inizierà con 0:

0XXXXXXX

Per i caratteri che vanno da 128 a 2047 si usano due byte, con questa struttura:

110XXXXX 10XXXXXX

Per quelli da 2048 a 65535 si usano tre byte, con la struttura

1110XXXX 10XXXXXX 10XXXXXX

E infine da 65535 a 1114111 si usano quattro byte, che hanno questi bit fissi:

11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

Quindi è sempre possibile sapere di quanti byte è composto l’intero carattere, perché se i primi bit a sinistra sono 110, allora si usano in totale 2 byte, se i primi bit sono 1110 si usano tre byte e così via. Con questo tipo di sequenze non vi è mai una serie di 8 bit consecutiva, e si usa il numero minimo di byte possibile.
Oggi Unicode offre un modo unico per codificare ogni tipo di carattere, inclusi anche i più antichi ideogrammi e sistemi cuneiformi. Il che è prezioso, perché già ora si sta lavorando a sistemi di OCR per leggere e memorizzare in eterno antiche iscrizioni presenti nelle pareti delle tombe o su antichi monumenti. Grazie alle tastiere virtuali Unicode diventa anche possibile scrivere nuovi testi, per esempio usando i geroglifici egizi.
Se siete curiosi di vedere ogni possibile simbolo inventato dall’uomo per comunicare, potete vedere armarvi di pop corn e vedere il film dell’Unicode: https://vimeo.com/48858289. Una avvertenza: dura due ore e mezza, ed è un po’ noioso. Probabilmente è più divertente l’epopea di Gilgamesh, magari in traduzione italiana.

Luca Tringali

Luca Tringali

Giornalista, autore per GNU/Linux Magazine Italia dal 2010, e attuale redattore della rivista. Si occupa di divulgazione scientifica e tecnologica, in particolare nel campo dell'intelligenza artificiale e la sicurezza informatica.

Potrebbero interessarti anche...