- 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.
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.
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".
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
10xxxxxxsenza un byte iniziale valido. - Lunghezze eccessive: codifica con più byte del necessario; ad esempio, provare a codificare un ASCII con 2 byte (
0xC0y0xC1non sono validi). - Lunghezze proibite: inizia suggerendo 5 o 6 byte (
0xF8-0xFDnon sono validi nello standard UTF-8). - Valori fuori dall'intervallo Unicode: non supportato sopra U+10FFFF; certi valori (
0xF5-0xF7come inizi) non sono validi. - Coppie surrogate UTF-16:
D800–DFFFnon 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.
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.
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.