NOME
UTF-8 - una codifica Unicode multi-byte compatibile con ASCIIDESCRIZIONE
The Unicode 3.0 character set occupies a 16-bit code space. The most obvious Unicode encoding (known as UCS-2) consists of a sequence of 16-bit words. Such strings can contain—as part of many 16-bit characters—bytes such as '\0' or '/', which have a special meaning in filenames and other C library function arguments. In addition, the majority of UNIX tools expect ASCII files and can't read 16-bit words as characters without major modifications. For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, and so on. The ISO 10646 Universal Character Set (UCS), a superset of Unicode, occupies an even larger code space—31 bits—and the obvious UCS-4 encoding for it (a sequence of 32-bit words) has the same problems. La codifica UTF-8 di Unicode e UCS evita questi problemi, ed è il modo comune con cui Unicode è usato nei sistemi operativi tipo UNIX.Proprietà
La codifica UTF-8 possiede queste ottime proprietà:- *
- I caratteri UCS da 0x00000000 a 0x0000007f (i caratteri US-ASCII classici) sono codificati semplicemente come byte da 0x00 a 0x7f (compatibilità ASCII). In altre parole, file e stringhe contenenti solamente caratteri ASCII a 7 bit hanno la stessa codifica sia in ASCII che in UTF-8.
- *
- All UCS characters greater than 0x7f are encoded as a multibyte sequence consisting only of bytes in the range 0x80 to 0xfd, so no ASCII byte can appear as part of another character and there are no problems with, for example, '\0' or '/'.
- *
- L'ordinamento lessicografico delle stringhe in UCS-4 viene preservato.
- *
- All possible 2^31 UCS codes can be encoded using UTF-8.
- *
- I byte 0xc0, 0xc1, 0xfe E 0xff non sono mai usati nella codifica UTF-8.
- *
- Il primo byte di una sequenza multibyte che rappresenta un carattere UCS non ASCII è sempre nell'intervallo da 0xc0 a 0xfd e indica la lunghezza della sequenza. Tutti i byte seguenti nella sequenza multibyte sono nell'intervallo da 0x80 a 0xbf, facilitando un'eventuale risincronizzazione e facendo diventare la codifica senza memoria e resistente a byte mancanti.
- *
- I caratteri UCS codificati con UTF-8 possono arrivare ai sei byte di lunghezza, tuttavia lo standard Unicode non specifica caratteri oltre 0x10ffff, così i caratteri Unicode possono essere lunghi solo fino a quattro byte in UTF-8.
Codifica
Le seguenti sequenze di byte vengono usate per rappresentare un carattere. La sequenza da usare dipende dal numero del codice UCS del carattere:- 0x00000000 - 0x0000007F:
- 0xxxxxxx
- 0x00000080 - 0x000007FF:
- 110xxxxx 10xxxxxx
- 0x00000800 - 0x0000FFFF:
- 1110xxxx 10xxxxxx 10xxxxxx
- 0x00010000 - 0x001FFFFF:
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- 0x00200000 - 0x03FFFFFF:
- 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10 xxxxxx
- 0x04000000 - 0x7FFFFFFF:
- 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10 xxxxxx 10xxxxxx
Esempio
Il carattere Unicode 0xa9 = 1010 1001 (il simbolo di copyright) si codifica in UTF-8 come11000010 10101001 = 0xc2 0xa9
e il carattere 0x2260 = 0010 0010 0110 0000 (il simbolo "non uguale")
si codifica come:
11100010 10001001 10100000 = 0xe2 0x89
0xa0
Note sull'applicazione
Gli utenti devono selezionare una localizzazione UTF-8, ad esempio conexport LANG=en_GB.UTF-8
per poter attivare il supporto UTF-8 nelle applicazioni.
I software applicativi che devono riconoscere la codica caratteri usata devono
sempre impostare la localizzazione con, ad esempio,
setlocale(LC_CTYPE, "")
e i programmatori possono quindi testare l'espressione
strcmp(nl_langinfo(CODESET),
"UTF-8") == 0
per determinare se una localizzazione UTF-8 è stata selezionata e se
quindi tutti gli input e output standard in testo, comunicazioni terminale,
contenuto in testo dei file, nomi file e variabili d'ambiente sono codificati
in UTF-8.
I programmatori abituati alle codifiche a singolo byte come US-ASCII o ISO 8859
devono ricordare che due assunzioni valide qui non sono più valide
nelle localizzazioni UTF-8. Innanzitutto un singolo byte non corrisponde
più necessariamente ad un singolo carattere. In secondo luogo,
poiché i moderni emulatori di terminale in modalità UTF-8
supportano anche caratteri a doppia larghezza cinese, giapponese e coreano e i
caratteri combinanti, non spaziati, l'emissione di un singolo carattere non
avanza necessariamente il cursore di una posizione come avveniva in ASCII.
Funzioni di libreria come mbsrtowcs(3) e wcswidth(3) oggi devono
essere usate posizioni di caratteri e cursore.
La sequenza ufficiale ESC per commutare da uno schema di codifica ISO 2022
(usato ad esempio dai terminali VT100) a UTF-8 è ESC % G
("\x1b%G"). La corrispondente sequenza di ritorno da UTF-8 a ISO
2022 è ESC % @ ("\x1b%@"). Altre sequenze ISO 2022 (come
quelle per commutare gli insiemi G0 e G1) non sono applicabili in
modalità UTF-8.
Sicurezza
Gli standard Unicode e UCS richiedono che i produttori di UTF-8 debbano usare la forma più breve possibile, ad esempio produrre una sequenza a due byte con primo byte 0xc0 non è conforme. Unicode 3.1 ha aggiunto la richiesta che i programmi conformi non debbano accettare le forme non brevi nel loro input. Ciò è per ragioni di sicurezza: se l'input utente è verificato per possibili violazioni di sicurezza, un programma può verificare solo la versione ASCII di "/../" o ";" o NUL e dimenticare che ci sono molti modi non- ASCII di rappresentare queste cose in una codifica UTF-8 non breve.Standard
ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.VEDERE ANCHE
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)TRADUZIONE
La traduzione italiana di questa pagina di manuale è stata creata da Ottavio G. Rizzo <[email protected]>, Giulio Daprelà <[email protected]>, Elisabetta Galli <[email protected]> e Marco Curreli <[email protected]> Questa traduzione è documentazione libera; leggere la GNU General Public License Versione 3 o successiva per le condizioni di copyright. Non ci assumiamo alcuna responsabilità. Per segnalare errori nella traduzione di questa pagina di manuale inviare un messaggio a [email protected]10 febbraio 2023 | Linux man-pages 6.03 |