ASCII, Unicode e UTF-8: le differenze e perché compare è al posto di è

ASCII, Latin-1, Windows-1252, Unicode, UTF-8: sono nomi che si incontrano quando un testo si rovina e al posto di una è compare è. Sembrano la stessa cosa ma non lo sono: in questa guida vedi cos'è ciascuno, come sono fatti i byte di caratteri reali e come evitare il pasticcio. Per consultare i codici puoi usare lo strumento Tabella ASCII.

ASCII: 128 caratteri a 7 bit

L'ASCII è la tabella storica che assegna un numero da 0 a 127 a lettere latine non accentate maiuscole e minuscole, cifre, punteggiatura e ai caratteri di controllo. Bastano 7 bit, cioè 128 valori. Non contiene nessuna lettera accentata, né il simbolo dell'euro: era pensato per l'inglese. La A è 65, la a è 97, la cifra 0 è 48.

ASCII esteso e code page: 256 valori, ma non uno solo

Poiché i byte hanno 8 bit, restava libera la metà alta, i valori da 128 a 255. Ogni produttore e ogni lingua l'ha riempita a modo suo, dando vita alle code page. Per questo l'espressione "ASCII esteso" non indica una tabella unica. Le più note:

Lo stesso byte, per esempio 0xE8, è è in Latin-1 e Windows-1252 ma un altro simbolo in CP437. Il problema delle code page è questo: il byte non dice da solo in quale tabella va letto. Se vuoi digitare quei caratteri sulla tastiera, c'è la guida ai codici Alt.

Unicode: un numero per ogni carattere

Unicode risolve il problema alla radice: assegna a ogni carattere di ogni scrittura un numero univoco, il code point, scritto in esadecimale con il prefisso U+. La è è U+00E8, l'euro è U+20AC, la faccina sorridente 😀 è U+1F600. Unicode però definisce solo l'elenco: per memorizzare quei numeri in un file serve una codifica.

UTF-8 e UTF-16: due codifiche di Unicode

UTF-8 usa da 1 a 4 byte per carattere. I primi 128 code point sono scritti con un solo byte identico all'ASCII, quindi un file in solo ASCII è già valido UTF-8. Gli altri caratteri usano più byte. UTF-16 usa invece unità da 2 byte: i caratteri più comuni ne occupano una, quelli oltre U+FFFF, come le emoji, ne richiedono due (coppia surrogata). UTF-8 è oggi la codifica prevalente sul web.

Byte reali: è, € e 😀

Ecco come cambiano i byte per tre caratteri, esadecimale:

CarattereCode pointUTF-8UTF-16Windows-1252
AU+00414100 4141
èU+00E8C3 A800 E8E8
€U+20ACE2 82 AC20 AC80
😀U+1F600F0 9F 98 80D8 3D DE 00non esiste

La A occupa un byte in UTF-8, la è due, l'euro tre e l'emoji quattro. Se vuoi giocare con i numeri esadecimali, il convertitore di basi numeriche passa da decimale a esadecimale e viceversa.

Perché compare è al posto di è (mojibake)

Il fenomeno si chiama mojibake e nasce da una discordanza: il testo è scritto con una codifica e letto con un'altra. Il caso più frequente è un file UTF-8 interpretato come Windows-1252. La è in UTF-8 sono i byte C3 A8; letti uno per volta in Windows-1252, C3 è à e A8 è ¨, da cui è. Allo stesso modo l'euro (E2 82 AC) diventa € e l'emoji 😀 diventa 😀. Se vedi sequenze che iniziano con Ã,  o â, è quasi sempre questo caso.

Il problema inverso, un file in Latin-1 letto come UTF-8, produce di solito il carattere di sostituzione (un rombo con un punto interrogativo) perché il singolo byte E8 non è una sequenza UTF-8 valida.

Come evitarlo

Come controllare un carattere

Se un testo contiene caratteri sospetti, nello strumento Tabella ASCII la scheda Analizza testo segnala quali caratteri non sono ASCII e quali sono invisibili, mentre il convertitore mostra i codici. Per approfondire i caratteri non stampabili leggi anche la guida su caratteri di controllo, LF e CR.

Domande frequenti

UTF-8 e Unicode sono la stessa cosa?
No. Unicode è l'elenco dei caratteri, ciascuno con un numero chiamato code point (per esempio U+00E8 per è). UTF-8 è uno dei modi per scrivere quei numeri in byte. Altre codifiche dello stesso elenco sono UTF-16 e UTF-32.
Perché al posto di è vedo è?
Il testo è stato salvato in UTF-8 ma viene letto come Windows-1252 o Latin-1. La è in UTF-8 occupa due byte, C3 e A8, e una lettura a un byte per carattere li mostra come due simboli separati: Ã e ¨. La soluzione è far dichiarare e leggere ovunque la stessa codifica, di solito UTF-8.
Quale codifica devo usare per un nuovo sito o file?
UTF-8 è la scelta consigliata nella quasi totalità dei casi: è compatibile con l'ASCII, rappresenta tutti i caratteri Unicode ed è lo standard de facto del web. Usa le altre codifiche solo se un sistema esistente lo impone.
Che cos'è il BOM e va tenuto?
È una breve sequenza all'inizio del file (EF BB BF in UTF-8) che segnala la codifica. In UTF-8 non è necessario e in alcuni contesti, come script, file di configurazione o intestazioni HTTP in PHP, può causare problemi. Excel invece lo usa a volte per riconoscere un CSV in UTF-8.
Un carattere occupa sempre lo stesso numero di byte?
Dipende dalla codifica. In ASCII e Latin-1 un carattere è un byte. In UTF-8 va da 1 a 4 byte: le lettere dell'alfabeto latino di base ne usano uno, le accentate due, simboli come l'euro tre, le emoji quattro. Per questo la lunghezza in byte di un testo può essere diversa dal numero di caratteri.

← Tutte le guide