UTF-8(7) | Miscellaneous Information Manual | UTF-8(7) |
UTF-8 - una codifica Unicode multi-byte compatibile con ASCII
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.
La codifica UTF-8 possiede queste ottime proprietà:
Le seguenti sequenze di byte vengono usate per rappresentare un carattere. La sequenza da usare dipende dal numero del codice UCS del carattere:
Le configurazioni di bit xxx sono riempite coi bit del numero del codice carattere rappresentato in binario, prima il bit più significativo (big-endian). Viene usata solo la più breve delle sequenze multibyte che possono rappresentare il numero del codice.
The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well as 0xfffe and 0xffff (UCS noncharacters) should not appear in conforming UTF-8 streams. According to RFC 3629 no point above U+10FFFF should be used, which limits characters to four bytes.
Il carattere Unicode 0xa9 = 1010 1001 (il simbolo di copyright) si codifica in UTF-8 come
e il carattere 0x2260 = 0010 0010 0110 0000 (il simbolo "non uguale") si codifica come:
Gli utenti devono selezionare una localizzazione UTF-8, ad esempio con
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,
e i programmatori possono quindi testare l'espressione
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.
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.
ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)
La traduzione italiana di questa pagina di manuale è stata creata da Ottavio G. Rizzo <rizzo@pluto.linux.it>, Giulio Daprelà <giulio@pluto.it>, Elisabetta Galli <lab@kkk.it> e Marco Curreli <marcocurreli@tiscali.it>
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 pluto-ildp@lists.pluto.it.
10 febbraio 2023 | Linux man-pages 6.03 |