Codifica dei caratteri: Unicode e UTF-8 spiegati
Aggiornato 2026-07-06
L'hai visto: un nome che dovrebbe leggersi José compare come José, o un'emoji diventa un riquadro di punti interrogativi. Quel pasticcio ha un nome — mojibake — ed è quasi sempre un disallineamento di codifica dei caratteri. Questa guida spiega cosa sono davvero i caratteri, Unicode e UTF-8, così questi bug smettono di essere misteriosi.
I computer memorizzano numeri, non lettere
Al livello più basso un computer memorizza solo numeri (byte). Per memorizzare del testo serve una tabella condivisa che associ ogni carattere a un numero, e viceversa. Quella tabella è una codifica dei caratteri. Se un programma scrive testo con una tabella e un altro lo legge con una diversa, i numeri vengono interpretati come i caratteri sbagliati — e ottieni il mojibake.
ASCII: il piccolo inizio
La codifica originaria e diffusa, ASCII, definiva numeri per 128 caratteri: l'alfabeto inglese, cifre, punteggiatura e alcuni codici di controllo. Sufficiente per l'inglese, ma nessuno spazio per é, ü, ß, 你, 😀 né per le decine di migliaia di caratteri delle lingue del mondo. Per decenni ognuno ha inventato le proprie estensioni incompatibili, ed è proprio per questo che il testo si rompeva passando da un sistema all'altro.
Unicode: un numero per ogni carattere
Unicode è la soluzione universale: un unico standard che assegna un numero univoco — chiamato code point — a ogni carattere di ogni sistema di scrittura, più simboli ed emoji. I code point si scrivono come U+ seguito da un numero esadecimale:
A → U+0041 é → U+00E9 你 → U+4F60 😀 → U+1F600
Fondamentale: Unicode definisce i numeri ma non come memorizzarli in byte. Questa è una decisione a parte — ed è qui che entra UTF-8.
UTF-8: come Unicode diventa byte
UTF-8 è un modo di codificare i code point Unicode in byte, ed è quello che il web usa in modo schiacciante. Il suo ingegnoso design è di essere a lunghezza variabile:
- I 128 caratteri ASCII occupano 1 byte ciascuno — quindi UTF-8 è retrocompatibile con ASCII.
- La maggior parte dei caratteri latini accentati e di quelli greci/cirillici occupa 2 byte.
- La maggior parte degli altri sistemi di scrittura, tra cui cinese, giapponese e coreano, occupa 3 byte.
- Emoji e caratteri più rari occupano 4 byte.
Ecco perché una stringa di «100 caratteri» non è sempre 100 byte: un carattere può essere più byte. Spiega anche il classico bug José — sono i byte UTF-8 di é letti per errore, un byte alla volta, come una vecchia codifica occidentale.
Caratteri, code point e byte
Tre concetti correlati ma diversi fanno inciampare le persone di continuo:
- Carattere (Character) — ciò che vede un umano (la lettera
é). - Code point — il numero Unicode per esso (
U+00E9). - Byte — come viene memorizzato (in UTF-8, i due byte
0xC3 0xA9).
Vedere un code point scritto per esteso è spesso il modo più rapido per diagnosticare un problema di testo — per esempio, uno «spazio» che si rivela essere uno spazio unificatore (U+00A0). Il nostro convertitore Unicode mostra i code point dietro qualsiasi testo e converte tra caratteri e sequenze di escape.
Come evitare il mojibake
- Usa UTF-8 ovunque. Salva i file come UTF-8 e dichiaralo — nelle pagine web,
<meta charset="utf-8">; in HTTP, il charset diContent-Type; nei database, una collazione UTF-8. - Mantienilo coerente da un capo all'altro. La maggior parte della corruzione avviene a un confine dove un lato presume una codifica diversa.
- Fai l'escape per il contesto giusto. Per mettere caratteri speciali in sicurezza nell'HTML, usa le entità HTML; per metterli in una URL, la codifica URL.
In breve: Unicode dà a ogni carattere un numero, UTF-8 trasforma quei numeri in byte, e se tutti concordano di usare UTF-8, il testo smette di rompersi.
Altro su Formati di dati & codifica
Vedi tutte le guide di Formati di dati & codifica →Strumenti citati in questa guida