Cos'è UTF-8: definizione, funzionamento, errori e usi

Ultimo aggiornamento: 25 agosto 2025
  • UTF-8 codifica i punti Unicode in 1–4 byte, è compatibile con ASCII ed è valido per qualsiasi lingua.
  • Auto-sincronizzazione e convalida: i modelli 0/110/1110/11110 impediscono sovrapposizioni e facilitano il rilevamento degli errori.
  • Web e sistemi: meta charset, supporto esteso e facile conversione su Windows/macOS/Linux.

Codifica UTF-8 e Unicode

Se oggi state leggendo questo articolo senza visualizzare simboli strani, è grazie a UTF-8 . Questa codifica permette di visualizzare lettere, accenti, simboli tecnici e persino emoji allo stesso modo in qualsiasi browser, sistema operativo o client di posta elettronica moderno. È lo standard più diffuso sul web e il fondamento della comunicazione digitale come la conosciamo.

Quando un dispositivo visualizza del testo, in realtà elabora dei numeri . Questi numeri sono punti di codice definiti dallo standard Unicode e, per convertirli in byte che viaggiano su una rete o vengono salvati in un file, eseguiamo una trasformazione: UTF-8 . Nelle righe seguenti, capirete cos'è, come funziona, perché è diventato uno standard, i suoi vantaggi e limiti e come evitare gli errori più comuni.

Cos'è UTF-8?

UTF-8 (8-bit Unicode Transformation Format) è un metodo per trasformare i punti di codice Unicode in sequenze di byte . La sua caratteristica principale è l'utilizzo di una lunghezza variabile : alcuni caratteri occupano 1 byte, mentre altri ne richiedono 2, 3 o 4. Ciò consente di ottenere testi compatti con semplici caratteri latini , ma può anche rappresentare qualsiasi carattere del repertorio Unicode.

È pienamente compatibile con ASCII : i primi 128 caratteri (da U+0000 a U+007F) sono codificati con un singolo byte identico all'ASCII a 7 bit. Ciò ha facilitato la transizione dai sistemi precedenti e spiega gran parte del suo successo su Internet, nelle e-mail e nei protocolli IETF.

UTF-8 si distingue per la sua robustezza : incorpora bit di sincronizzazione che consentono l'identificazione affidabile dell'inizio di ciascun simbolo. Questa proprietà di autosincronizzazione semplifica il rilevamento della somiglianza di una sequenza con UTF-8 , il che risulta molto utile per strumenti e parser.

Unicode: il fondamento di tutto

Unicode è lo standard universale che assegna un numero univoco a ciascun carattere , indipendentemente dalla lingua, dalla piattaforma o dall'applicazione. Questo numero è chiamato punto di codice e viene solitamente scritto in esadecimale nel formato U+XXXX (o con più cifre, se necessario).

Ad esempio, La lettera maiuscola “A” è U+0041In HTML possiamo anche riferirci ad esso come A. Il tuo computer non "pensa" alla A come una lettera, ma come al numero 65, quindi la codifica (ad esempio UTF-8) decide come rappresentare quel numero in byte.

Se vuoi vedere come Unicode viene tradotto in caratteri sul tuo PC , su Windows puoi tenere premuto il tasto Alt e digitare il codice numerico decimale sul tastierino numerico: ad esempio, Alt+65 restituisce "A" (vedi l'elenco completo dei codici Alt ). È una scorciatoia classica che mostra come i codici sono alla base dei caratteri che vedi.

Un po' di storia: come è nato UTF-8

UTF-8 è stato ideato da Ken Thompson sotto la guida di Rob Pike il 2 settembre 1992. È stato implementato nel sistema operativo Plan 9 di Bell Labs e presentato ufficialmente a USENIX (San Diego, gennaio 1993) . Durante il suo processo di standardizzazione, sponsorizzato dall'X /Open Joint Internationalization Group (XOJIG) , è stato conosciuto con nomi come FSS/UTF e UTF-2 prima di essere consolidato come UTF-8.

Il progetto ha risolto i problemi pratici che affliggevano i precedenti tentativi di codifica universale: compatibilità con ASCII, autosincronizzazione, assenza di byte sovrapposti e facilità di rilevamento degli errori. Questo equilibrio lo ha reso lo standard di fatto del web.

  Raffreddamento a liquido per il gaming: la guida completa per il tuo PC

Come funziona UTF-8 sotto il cofano

UTF-8 raggruppa i caratteri in base ai byte necessari per codificarli . Il numero di byte dipende esclusivamente dal punto di codice Unicode e segue schemi di bit che indicano la lunghezza della sequenza.

  • 1 byte (da U+0000 a U+007F): Caratteri ASCII. Formato: 0xxxxxxxIl bit più significativo è 0, che garantisce la compatibilità diretta con ASCII.
  • 2 byte (da U+0080 a U+07FF): Formato 110yyyyy 10xxxxxx. Viene utilizzato per la maggior parte degli alfabeti europei con segni diacritici e altri come il greco, il cirillico, l'ebraico o l'arabo..
  • 3 byte (da U+0800 a U+FFFF): Formato 1110zzzz 10yyyyyy 10xxxxxx. Include il piano base multilingue (BMP), con CJK (cinese, giapponese, coreano), simboli tecnici e caratteri più comunemente usati.
  • 4 byte (da U+10000 a U+10FFFF): Formato 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Rappresenta i piani supplementari: simboli matematici avanzati, scritti storici, simboli ideografici meno comuni, ecc.

La chiave dell'autosincronizzazione risiede nei bit dell'intestazione : 0 per ASCII; 110 per due byte; 1110 per tre; 11110 per quattro. I byte di continuazione iniziano sempre con 10. Grazie a ciò, un byte di continuazione non può mai apparire come byte iniziale e una sequenza valida non può mai essere una sottostringa di una più lunga (principio di non sovrapposizione).

Equivalenza con UTF-16 e coppie surrogate

UTF-16 rappresenta i punti di codice BMP con un'unità di 16 bit e punti sopra U+FFFF con coppie sostitutive nella gamma D800–DFFF. Anziché, UTF-8 codifica sempre i punti di codice reali, non unità UTF-16, il che evita confusione con i sostituti.

Storicamente, alcune bozze consentivano 5 o 6 byte in UTF-8 per coprire un intervallo più ampio, ma Unicode e RFC 3629 limitano l'UTF-8 a un massimo di 4 byte . ISO/IEC ha preso in considerazione opzioni più ampie, ma queste non fanno parte dello standard attuale.

Esempio pratico: la ñ

Il carattere “ñ” ha il punto di codice U+00F1, che rientra nell'intervallo di due byte. Seguendo lo schema, è codificato come 110xxxxx 10xxxxxx. La sua rappresentazione UTF-8 è 0xC3 0xB1La decodifica è il processo inverso: lettura dei bit utili e ricostruzione del punto di codice originale.

Vantaggi e limiti di UTF-8

Principali vantaggi :

  • Supporto ASCII: I testi ASCII sono validi in UTF-8 senza modifiche.
  • universale: può rappresentare qualsiasi carattere Unicode, inclusi simboli tecnici ed emoji.
  • Efficienza nei testi latini: quando si utilizza 1 byte per ASCII, consente di risparmiare spazio rispetto a UTF-16 in molte lingue occidentali.
  • Autosincronizzazione e rilevamento: i modelli di bit consentono rilevare gli inizi dei personaggi e convalidare le sequenze con facilità.

Limitazioni e compromessi :

  • I testi CJK occupano più spazio dei testi UTF-16, dove molti di quei caratteri rientrano in 2 byte fissi.
  • Costo di calcolo: essendo di lunghezza variabile, alcune operazioni (ad esempio, "vai al carattere n") richiedono di procedere dall'inizioe alcune attività potrebbero essere più veloci in UTF-16/UTF-32.

BOM (Byte Order Mark) in UTF-8

UTF-8 non necessita di BOM perché l'ordine dei byte non cambia il significato dei valori (l'unità minima è il byte). Anche così, C'è una distinta base opzionale, il carattere U+FEFF codificato come EF BB BF all'inizio di un file o di un flusso, che può essere utilizzato per indicare "questo è Unicode/UTF-8".

  Come controllare un PC dal cellulare gratuitamente: una guida completa a strumenti e metodi

Buone pratiche : se compare all'inizio, alcuni sistemi lo accettano e altri lo trattano letteralmente. Nelle concatenazioni, è consigliabile rimuovere i BOM intermedi . Includerlo non è obbligatorio e la sua utilità in UTF-8 è limitata rispetto a UTF-16/UTF-32, dove indica l'endianness.

Errori di codifica tipici e come gestirli

Un decodificatore UTF-8 robusto deve rifiutare le sequenze non valide , sostituirle con U+FFFD (CARATTERE DI SOSTITUZIONE) o segnalare un errore. Gli errori più comuni sono:

  • Sequenze troncate: un byte iniziale multibyte senza sufficienti continuazioni.
  • Byte di continuazione allentati: apparire 10xxxxxx senza un byte iniziale valido.
  • Lunghezze eccessive: codifica con più byte del necessario; ad esempio, provare a codificare un ASCII con 2 byte (0xC0 y 0xC1 non sono validi).
  • Lunghezze proibite: inizia suggerendo 5 o 6 byte (0xF8-0xFD non sono validi nello standard UTF-8).
  • Valori fuori dall'intervallo Unicode: non supportato sopra U+10FFFF; certi valori (0xF5-0xF7 come inizi) non sono validi.
  • Coppie surrogate UTF-16: D800–DFFF non sono punti di codice validi in Unicode; non dovrebbero apparire codificati in UTF-8.

Quando visualizzi il carattere “�” sullo schermo , è molto probabilmente dovuto a un'incongruenza di codifica o a un file salvato con una codifica diversa. La soluzione consiste nell'imporre la codifica UTF-8 end-to-end (file, server, database, intestazioni HTTP).

UTF-8 sul web e nella posta elettronica

Una pagina HTML deve dichiarare una sola codifica . La codifica consigliata, per compatibilità e ambito, è UTF-8. Inserite il seguente meta tag nell'intestazione il prima possibile:

<meta charset="UTF-8">

Inseritelo all'inizio del tag `<head>` in modo che il browser lo legga prima di elaborare il documento. Questo previene incongruenze e caratteri "danneggiati". L'adozione di UTF-8 sul web è massiccia ; è utilizzato dalla stragrande maggioranza dei siti web attuali.

Nelle e-mail, UTF-8 è ampiamente supportato e raccomandato da organizzazioni come l'Internet Mail Consortium. Configurare i client di posta elettronica per utilizzare UTF-8 riduce i problemi nello scambio di messaggi con persone che parlano altre lingue.

UTF-8, UTF-16 e UTF-32: qual è la differenza?

UTF-8 : Codifica a lunghezza variabile in unità a 8 bit; ideale per il web , molto efficiente con ASCII e lingue occidentali. Eccellente compatibilità e rilevamento degli errori.

UTF-16 : lunghezza variabile in unità a 16 bit; utilizza coppie surrogate per U+10000 e superiori. È spesso vantaggioso quando predominano i caratteri non ASCII ed è utilizzato in molte API e piattaforme (ad esempio, Windows funziona nativamente in UTF-16 ).

UTF-32 : lunghezza fissa di 32 bit per carattere; molto semplice da indicizzare , ma richiede molto spazio. È riservato ai casi in cui la dimensione è secondaria rispetto alla semplicità di elaborazione.

Varianti incompatibili: CESU-8 e “UTF-8 modificato”

CESU-8 codifica direttamente le unità UTF-16 (incluse le coppie surrogate) anziché codificare i punti di codice, differenziandosi quindi dallo standard UTF-8 per i caratteri superiori a U+FFFF. Alcune piattaforme storiche lo utilizzavano: Oracle 8 lo offriva con l'alias UTF-8 e, a partire da Oracle 9, ha aggiunto lo standard UTF-8 con un alias diverso. Java e Tcl hanno utilizzato CESU-8 in determinati contesti.

La codifica UTF-8 modificata (ad esempio, negli ambienti Java) rappresenta il carattere NUL (U+0000) come 0xC0 0x80 anziché 0x00. In questo modo si evita il byte nullo nelle stringhe C , ma non si è conformi allo standard UTF-8. Molte implementazioni di questa versione "modificata" sono comunque conformi anche allo standard CESU-8.

  Computer fisso o computer all-in-one: le differenze reali e qual è la soluzione migliore per te

UTF-8 su Windows e API: pagine di codice e conversione

Windows funziona internamente in UTF-16 (WCHAR), ma dalla versione 10 di Windows 1903 è possibile forzare UTF-8 come code page del processo tramite il manifesto dell'applicazione (proprietà activeCodePage). Ciò semplifica il funzionamento del codice legacy che utilizza le API "-A" su UTF-8.

API -A vs -W: il -A dipendono dalla tabella codici ANSI configurato (può essere CP_UTF8), mentre il -W loro usano UTF-16Per interoperare, MultiByteToWideChar y WideCharToMultiByte consentono di convertire tra UTF-8 e UTF-16; Stati Uniti d'America CP_UTF8 e, se applicabile, MB_ERR_INVALID_CHARS per rilevare errori di input.

Compatibilità reale: browser e sistemi

UTF-8 è compatibile con i browser moderni (Chrome, Firefox, Safari, Edge, Opera e le versioni recenti di Internet Explorer) e con la maggior parte dei sistemi operativi (Windows, Linux, macOS, Android, iOS). A meno che non si utilizzi un software molto vecchio, non dovrebbero esserci problemi.

Come convertire i file in UTF-8

In Windows (Blocco note) : apri il file, vai su "File > Salva con nome…" e in "Codifica" scegli UTF-8 . Salva con un nuovo nome se vuoi conservare l'originale.

In macOS (TextEdit) : in "TextEdit > Preferenze > Apri e salva", seleziona Unicode (UTF-8) durante il salvataggio. Quindi esporta il file con questa opzione abilitata.

Su linux: con il terminale puoi usare iconv. Ad esempio: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Controlla più tardi che anche l'applicazione che lo utilizza si aspetta UTF-8.

Come si fa a capire se un file è in formato UTF-8? Molti editor moderni lo indicano nella barra di stato. Se compaiono caratteri strani come “�”, accenti corrotti o “ñ/ç” visualizzati in modo errato, è necessario controllare la codifica del file e le impostazioni dell'editor, del server o del database.

Buone pratiche per evitare sorprese

Dichiara UTF-8 il prima possibile nelle intestazioni HTML e HTTP. Allinea la codifica in tutta la struttura (file sorgente, modelli, database e connessione). Evita di mescolare codifiche nella stessa pagina o flusso e utilizza strumenti che convalidano/normalizzano l'input.

Per integrazioni e API, specificare sempre la codifica nelle intestazioni (Content-Type: application/json; charset=UTF-8, per esempio). Test con dati multilingue (accenti, CJK, emoji) per individuare i punti deboli prima della produzione.

UTF-8 si è affermato perché bilancia compatibilità, efficienza e diffusione . È il modo più pratico per garantire che il testo venga trasmesso integro attraverso culture, sistemi e applicazioni diverse, indipendentemente dal fatto che includa accenti, simboli tecnici o alfabeti non latini.

cos'è il codice Unicode
Articolo correlato:
Che cos'è Unicode: guida completa, usi e codifiche