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:
- CP437: la tabella dei vecchi PC IBM e del prompt dei comandi, con lettere accentate e simboli per disegnare riquadri.
- ISO-8859-1 (Latin-1): copre le lingue dell'Europa occidentale, italiano incluso. I suoi 256 valori coincidono con i primi 256 code point di Unicode.
- Windows-1252: simile a Latin-1, ma nell'intervallo 128-159 al posto dei caratteri di controllo mette simboli utili come € (0x80), le virgolette tipografiche e il trattino lungo.
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:
| Carattere | Code point | UTF-8 | UTF-16 | Windows-1252 |
|---|---|---|---|---|
| A | U+0041 | 41 | 00 41 | 41 |
| è | U+00E8 | C3 A8 | 00 E8 | E8 |
| € | U+20AC | E2 82 AC | 20 AC | 80 |
| 😀 | U+1F600 | F0 9F 98 80 | D8 3D DE 00 | non 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
- Salva i file in UTF-8 dal tuo editor e usa sempre la stessa codifica in tutto il progetto.
- Dichiara la codifica nelle pagine web con
<meta charset="utf-8">e nell'intestazione HTTP Content-Type. - Database: in MySQL e MariaDB usa utf8mb4, perché il vecchio utf8 gestisce al massimo 3 byte per carattere e non riesce a salvare le emoji.
- File CSV: se Excel mostra male gli accenti, importa il file indicando UTF-8 oppure salvalo con BOM.
- Non convertire due volte: ricodificare un testo già rovinato peggiora il danno. Torna al file originale.
- URL e Base64: quando un testo passa in un indirizzo, i caratteri non ASCII vengono prima trasformati in byte UTF-8 e poi in percentuale. Lo vedi con la codifica URL e con il convertitore Base64.
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.