UTF-8

Da Parracomumangi.

Ovvero, perché tanti problemi con delle semplici lettere nonostante i computer siano sempre più potenti?

ASCII

Sappiamo che l'unità di base delle informazioni digitali è il byte, cioè una sequenza di 8 bit (ogni bit può essere 0 o 1). Le combinazioni ottenibili in un byte sono 256 (28, dove 8 è il numero di bit).

Data la bassa affidabilità delle prime trasmissioni, si preferì usare solo quei byte con un numero pari di 1: in tal modo, se gli 1 erano dispari il byte era considerato non valido (la probabilità di avere più errori era molto bassa). Il primo bit in pratica serviva solo come bit di controllo per rendere pari gli uni nel byte durante l'invio (bit di parità) e non per rappresentare il carattere. Si usavano quindi 7 bit, equivalenti a 128 combinazioni e quindi 128 caratteri (non tutti visibili: alcuni riservati per usi tecnici, come rappresentare la fine di un file o fine riga ecc.). Allora fu creato il codice ASCII, standard statunitense (cioè punteggiatura di base, lettere inglesi ed il simbolo del dollaro "$").

Interpretazioni regionali

Quando le trasmissioni furono ritenute sicure e si cominciarono ad usare tutti gli 8 bit, per le lingue con alfabeti basati su quello latino fu possibile usare le combinazioni inutilizzate da ASCII per rappresentare lettere aggiuntive. Ma si trattava di interpretazioni regionali incompatibili, visto che le ulteriori 128 combinazioni disponibili non bastavano per tutti. Se in tedesco si era scelta una combinazione per rappresentare la "ü" ma quella stessa combinazione in italiano rappresentava la "ì", è facile immaginare che un documento tedesco visualizzato in un computer italiano mostrava delle "ì" per ogni "ü". In realtà ogni interpretazione regionale include un certo numero di lingue compatibili (Europa centrale, occidentale, orientale...).

Unicode

Finalmente all'inizio degli anni '90 fu creato un codice universale che assegnava un carattere univoco per ogni numero: Unicode, una sorta di grande tabella nella quale ad ogni numero è associato un carattere con lettere per tutte le lingue attuali, e alcune morte. Ogni carattere Unicode però era lungo 2 byte ovvero il doppio di uno ASCII, quindi 16 bit (216 = 65.536 combinazioni possibili). Importante notare che i numeri usati per rappresentare ASCII sono gli stessi di ASCII. L'inconveniente era che un testo in Unicode occupava il doppio dello spazio.

UTF-8

Tuttavia c'è una soluzione per diminuire lo spazio occupato da Unicode, ovvero UTF-8, una rappresentazione basata sul fatto che l'ASCII puro usa 7 bit. Ecco un byte UTF-8:

IDDDDDDD

Il primo bit è un indicatori: quando esso è 0 il resto del byte sarà un carattere nel puro, vecchio, primitivo ma poco ingombrante ASCII, mentre se è 1, significa che il byte deve essere concatenato al carattere successivo (o ai successivi) per rappresentare un carattere non ASCII (dettagli tecnici)..


Prendendo ad esempio l'esperanto, abbiamo poche lettere che non sono in ASCII (ĉĝĥĵŝŭ): solo tali lettere occupano 2 byte in UTF-8, il resto sarà 1 byte: in altre parole, in termini di quantità di byte usati, scrivere in UTF-8 equivale esattamente a scrivere col sistema cx (!!). Lo stesso vale per l'italiano: (àèìòù éó). Le seguenti frasi occupano lo stesso spazio sia in ASCII che in UTF-8:


  1. Questo e' del testo con gli apostrofi al posto degli accenti
  1. Ankaux mi sxatas la kodsistemon UTF-8
  2. Ankau^ mi s^atas la kodsistemon UTF-8
  3. Ankaŭ mi ŝatas la kodsistemon UTF-8

Fondamentalmente questo è tutto ciò che serve sapere. L'argomento è più ampio: la "guerra" big/little endian, l'ormai sconsigliato BOM (Byte Order Mark) ed altre cose che chiunque può trovare in rete.

Un difetto di UTF-8 con la sua variabilità di lunghezza dei caratteri è che un carttere di una lingua con alfabeto "grande", occuperà 3 byte contro i 2 byte di altre codifiche come UTF-16 o l'Unicode "puro". Comunque c'è da considerare che con gli alfabeti grandi come il cinese si creano testi molto compatti. Consideriamo che un ideogramma cinese può corrispondere una parola intera o metà di essa, mentre un carattere di un qualsiasi alfabeto fonetico rappresenta un suono che è parte di una parola. È per questo che un testo in italiano (esperanto, inglese ecc.) tradotto in cinese guadagna spazio. Cioè: servono 3 byte per un carattere, ma tale carattere è molto di più che una semplice lettera, è una parola.

Esempio 1

家 occupa 3 byte, e questo sembra tanto. Ma traducendolo in italiano, scopriamo che significa "abitazione". Cioè basta da solo a fare ciò che fa una parola italiana composta da varie lettere (10 byte).

Esempio 2

Proviamo a trascrivere due note parole cinesi da ideogrammi a caratteri latini. I seguenti indicano le forze opposte Yin e Yang: "阴阳" occupano 3+3=6 byte. Se trascritti in ASCII diventano "Yin Yang", ovvero 7 caratteri più lo spazio necessario per separare le parole, che in cinese non si usa: 7+1=8 byte (anche eliminando lo spazio siamo a 7). Scrivendoli invece in pinyin (UTF-8) abbiamo "Yīn Yáng"; considerando che le vocali accentate occupano 2 byte, la stringa arriva a 10 byte. Quindi il problema dello spazio occupato da un documento in ideogrammi con UTF-8 è relativo solo considerando un singolo carattere, non ad un testo. Possiamo concludere serenamente che una lingua scritta in ideogrammi è solo a prima vista svantaggiata, se si considera un singolo carattere; ma non lo è affatto se si considera la potenza espressiva di quel carattere in un testo, che gli permette di rappresentare un'intera parola.

Approfondimenti