UTF-8: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Frack (discussione | contributi)
m interwiki
mNessun oggetto della modifica
 
(118 versioni intermedie di 84 utenti non mostrate)
Riga 1:
'''UTF-8''' (Unicode Transformation Format, 8 bit) è una [[codifica di caratteri]] [[Unicode]] in sequenze di lunghezza variabile di byte, creata da [[Rob Pike]] e [[Ken Thompson]]. UTF-8 usa gruppi di byte per rappresentare i caratteri [[Unicode]], ed è particolarmente utile per il trasferimento tramite sistemi di [[posta elettronica]] a 8-[[Bit (informatica)|bit]].
[[categoria: da controllare]]
'''UTF-8''' ('''U'''nicode '''T'''ransformation '''F'''ormat, '''8''' bit) è una codifica dei caratteri [[Unicode]] in sequenze di lunghezza variabile di byte, creata da [[Rob Pike]] e [[Ken Thompson]]. UTF-8 usa gruppi di byte per rappresentare i caratteri [[Unicode]], ed è particolarmente utile per il trasferimento tramite sistemi di [[posta elettronica]] a 8-[[bit]].
 
== Storia ==
UTF-8 usa da 1 a 4 [[byte]] per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell'alfabeto [[ASCII]], corrispondenti alle posizioni Unicode da U+0000 a U+007F.
UTF-8 è stato ideato da [[Ken Thompson]] e [[Rob Pike]] il 2 settembre [[1992]] su una tovaglietta in una tavola calda del [[New Jersey]]. Il giorno dopo Pike e Thompson l'hanno implementato e hanno aggiornato [[Plan 9]], il loro [[Sistema operativo]], per usarlo.
 
UTF-8 è stato presentato ufficialmente nel gennaio del [[1993]] a [[San Diego]] in occasione della conferenza annuale di [[USENIX]].
Anche se può sembrare inefficiente rappresentare i simboli Unicode con 4 byte, UTF-8 permette ai sistemi ''legacy'' di trasmettere questo super-insieme dello standard ASCII. In più la [[compressione]] dei dati è ancora possibile indipendentemente dall'uso di UTF-8.
 
== Caratteristiche generali ==
La [[IETF]] (''Internet Engineering Task Force'') richiede che tutti i [[Protocollo_di_rete|protocolli]] [[Internet]] identifichino la codifica dei caratteri utilizzata, e che siano in grado di utilizzare almeno UTF-8.
UTF-8 usa da 1 a 4 [[byte]] per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell'alfabeto [[ASCII]], corrispondenti alle posizioni Unicode da U+0000 a U+007F.
 
Quattro byte possono sembrare troppi per un solo carattere; tuttavia questo è richiesto solo per i caratteri che stanno fuori dal ''Basic Multilingual Plane'', generalmente molto rari. Inoltre anche [[UTF-16]] (la principale alternativa a UTF-8) richiede quattro byte per questi caratteri. Quale sia più efficiente, UTF-8 o UTF-16, dipende dall'intervallo di caratteri utilizzati, e l'uso di [[Compressione dei dati|algoritmi di compressione]] tradizionali riduce in maniera significativa la differenza tra le due codifiche. Per brevi brani di testo, su cui gli algoritmi di compressione tradizionali non sono efficienti ed è importante una ridotta occupazione di memoria, si potrebbe utilizzare lo [[Schema di compressione standard per Unicode]].
== Descrizione ==
UTF-8 viene descritto nello standard RFC 3629 (''UTF-8, un formato di trasformazione dell'[[ISO 10646]]'').
 
La [[Internet Engineering Task Force|IETF]] (''Internet Engineering Task Force'') richiede che tutti i [[Protocollo di rete|protocolli]] [[Internet]] identifichino la codifica dei caratteri utilizzata, e che siano in grado di utilizzare almeno UTF-8.
Brevemente, i bit che compongono un carattere Unicode vengono suddivisi in gruppi, che vengono poi ripartiti tra i bit meno significativi all'interno dei byte che formano la codifica UTF-8 del carattere.
 
== Descrizione tecnica==
I caratteri inferiori a 128<sub>dec</sub> vengono rappresentati con un singolo byte contenente il loro valore; essi corrispondono esattamente ai 128 caratteri ASCII.
UTF-8 viene descritto nello standard RFC 3629 (''UTF-8, un formato di trasformazione dell'[[ISO 10646]]''). Brevemente, i bit che compongono un carattere Unicode vengono suddivisi in gruppi, che vengono poi ripartiti tra i bit meno significativi all'interno dei byte che formano la codifica UTF-8 del carattere.
 
I caratteri il cui valore unicode è inferiore a U+0080 vengono rappresentati con un singolo byte contenente il loro valore; essi corrispondono esattamente ai 128 caratteri ASCII. In tutti gli altri casi sono necessari fino a 4 byte, ognuno di questi con il bit più significativo impostato a 1, in modo da distinguerli dalla rappresentazione dei caratteri inferioridell'alfabeto ASCII a 128<sub>dec</sub>7 bit, in particolare quelli il cui codice unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo.
 
{| class="wikitable"
<small>
{| border=1
|-
|!Intervallo Unicode<br />[[esadecimale]]
|![[UTF-16]]
|!UTF-8<br />[[Sistema numerico binario|binario]]
|!Note
|-
|0x000000-0x00007F
|000000 - 00007F
|00000000 0xxxxxxx&nbsp;0XXXXXXX
|0XXXXXXX
|0xxxxxxx
| Caratteri equivalenti al codice ASCII; Ii byte iniziano con 0 e da soli indicano un carattere
|-
|0x000080-0x0007FF
|000080 - 0007FF
|00000XXX&nbsp;XXXXXXXX
|00000xxx xxxxxxxx
|110XXXXX&nbsp;10XXXXXX
|110xxxxx 10xxxxxx
| rowspan=2 align=top| il primo byte inizia per 110 o 1110, il successivo(i) con 10 e devono essere concatenati per formare un carattere
|-
|0x000800-0x00FFFF
|000800 - 00FFFF
|XXXXXXXX&nbsp;XXXXXXXX
|xxxxxxxx xxxxxxxx
|1110XXXX&nbsp;10XXXXXX&nbsp;10XXXXXX
|1110xxxx 10xxxxxx 10xxxxxx
|-
|0x010000-0x10FFFF
|010000 - 10FFFF
|110110XX&nbsp;XXXXXXXX<br />110111XX&nbsp;XXXXXXXX
|110110xx xxxxxxxx <br>110111xx xxxxxxxx
|11110XXX&nbsp;10XXXXXX&nbsp;10XXXXXX&nbsp;10XXXXXX
|11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|Confronto tra UTF-16 e UTF-8: UTF-16 richiede l'uso di coppie surrogate;: viene sottratto il valore esadecimale 0x10000, in modo che la sequenza dei bit non coincida con quella usata da UTF-8
|}
</small>
 
Per esempio, il carattere [[aleph|alef]] (&#1488;א), corrispondente all'Unicode 0x05D0U+05D0, viene rappresentato in UTF-8 con questo procedimento:
 
* ricade nell'intervallo da 0x0080 a 0x07FF. Secondo la tabella verrà rappresentato con due byte. ''110xxxxx 10xxxxxx''.(110XXXXX 10XXXXXX);
* l'esadecimale 0x05D0 equivale al binario 101-1101-0000.;
* gli undici bit vengono copiati in ordine nelle posizioni marcate con "X": 110-''x'10111'. ''110 10-''-10111 '010000'10''-010000.;
* il risultato finale è la coppia di byte 11010111 10010000, o in esadecimale 0xD7 0x90.
 
Riassumendo, i primi 128 caratteri vengono rappresentati con un singolo byte. I successivi 1920 ne richiedono due, e comprendono gli alfabeti [[Alfabeto_latinoAlfabeto latino|Latino]] con [[Diacritico|diacritici]], [[Alfabeto_grecoAlfabeto greco|Greco]], [[Alfabeto_cirillicoAlfabeto cirillico|Cirillico]], [[Alfabeto_coptoAlfabeto copto|Copto]], [[Alfabeto_armenoAlfabeto armeno|Armeno]], [[Alfabeto_ebraicoAlfabeto ebraico|Ebraico]] e [[Alfabeto_araboAlfabeto arabo|Arabo]]. I restanti caratteri [[UCS-2]]nel ''Basic Multilingual Plane'' hanno bisogno di tre byte, tutto il resto di quattro.
 
In realtàPotenzialmente, UTF-8 èsarebbe in grado di usare sequenze fino a 6 byte, coprendo l'intervallo da 0x00U+0000 a 0x7FFFFFFFU+7FFFFFFF (31 bit), ma nel [[2003]] UTF-8 è stato limitato dallo standard RFC 3629 per coprire solo l'intervallo descritto formalmente nello standard Unicode, ovvero da 0x00U+0000 a 0x10FFFFU+10FFFF. In precedenza i soli byte che non potevano comparire in una sequenza UTF-8 valida erano 0xFE e 0xFF. Con l'introduzione del precedente limite, il numero di byte non usati dalla codifica UTF-8 è salito a 13: 0xC0, 0xC1, e da 0xF5 a 0xFF. Anche se la nuova definizione di UTF-8 limita in modo consistente l'insieme di caratteri Unicode rappresentabili, il problema delle rappresentazioni multiple dello stesso carattere, un potenziale rischio per la sicurezza, scompare in quanto ognuna di queste sequenze conterrebbe uno dei byte non usati, risultando non valida.
 
== UTF-8 Modificato ==
Il [[Linguaggiolinguaggio di programmazione Java]], che usa perUTF-16 lacome rappresentazione codificainterna dei caratteri, usa per la loro serializzazione su file una variazione non standard di UTF-8,<ref>{{cita conosciutaweb|url=https://download.oracle.com/javase/6/docs/api/java/io/DataInput.html#modified-utf-8|titolo=Documentazione tradella gliclasse utenti<code>java.io.DataInput</code>, disezione Java"Modified come '''UTF-8"|accesso=4 maggio Modificato'''2011}}</ref>.
 
Ci sono due differenze tra la codifica UTF-8 standard e quella modificata. La prima differenza è che il carattere nullo (0x0000U+0000) viene rappresentato con due byte anzichèanziché uno, nello specifico come 11000000 10000000 (0xC0 0x80). In questo modo ci si assicura che nessuna stringa dicodificata venga troncata prematuramente caratteriperché contengacontenente il caratterebyte ''null'' (0x00), probabilmenteinterpretato perda prevenirealcuni problemilinguaggi di troncamentoprogrammazione delle(ad stringhe in linguaggi comeesempio il [[Linguaggio_CLinguaggio C|C]],) checome lo usano per indicare la fine diterminatore unadella stringa.
 
La seconda differenza riguarda la rappresentazione dei caratteri al di fuori del BMP (''Basic Multilingual Plane''). UtilizzantoUtilizzando l'UTF-8 standard questi caratteri vengono rappresentati con 4 byte, secondo il formato nella tabella precedente. Con UTF-8 modificato questi caratteri vengono prima rappresentati come coppie surrogate (come in UTF-16), e successivamente entrambi igli caratterielementi della coppia vengono codificati individualmente in UTF-8. Il motivo di questa differenza non è ovvio. In Java un carattere è lungo 16 bit, quindi alcuni caratteri Unicode devono essere rappresentati come sequenze di due caratteri. Questo aspetto del linguaggio è precedente all'introduzione dei piani supplementari in Unicode, ma è importante sia per fattori legati alle prestazioni, che per la compatibilità all'indietroretrocompatibilità, ed è quindi improbabile che venga corretto. L'encoding modificato assicura che che una stringa codificata possa essere decodificata un carattere (a 16 bit) per volta, anzichèanziché un carattere Unicode per volta. Sfortunatamente questo vuol dire che i caratteri che richiedono 4 byte per essere rappresentati in UTF-8, siano rappresentati in UTF-8 modificato con sequenze di 6 byte.
 
== MotivazioniCaratteristiche di UTF-8 ==
In conseguenza dei meccanismi di funzionamento di UTF-8, le sequenze di byte godono di queste proprietà:
 
* Il bit pù significativo di ogni sequenza composta di un singolo byte è sempre 0.
* Il bit più significativo di ogni sequenza composta di un singolo byte è sempre 0.
* I bit più significativi del primo di una sequenza di più byte indicano la lunghezza della sequenza. Questi bit sono 110 per le sequenze di due byte, e 1110 per quelle di tre.
* I byte successivi al primo in una sequenza composta da più byte hanno sempre 10 come bit più significativi.
 
UTF-8 è stato progettato per soddisfare queste tre proprietà, in modo da garantire che nessuna sequenza di byte corrispondente a uno specifico carattere sia contenuta in una sequenza più lunga, usata per codificare un carattere diverso. Grazie a questa caratteristica la ricerca di parole o frasi all'interno di un testo può essere effettuata tramite confronto byte per byte; qualche precedente sistema di codifica basato su sequenze di lunghezza variabile di byte (per esempio [[Shift-JIS]]) non godeva di questa proprietà, rendendo gli [[Algoritmo|algoritmi]] di confronto tra stringhe complicati. Nonostante si possa obiettare che questa caratteristica aggiunga ridondanza alla codifica del testo, i vantaggi sono maggiori degli svantaggi; inoltre la compressione dei dati non è uno degli scopi di Unicode, e va considerata separatamente. Infine, ancora grazie a questa proprietà, se uno o più byte andassero persi per errori di trasmissione o per corruzione dei dati, sarebbe possibile risincronizzare la decodifica all'inizio del carattere successivo, limitando i danni.
UTF-8 è stato progettato per soddisfare queste tre proprietà, in modo da garantire che nessuna sequenza di byte corrispondente a uno specifico carattere sia contenuta in una sequenza più lunga, usata per codificare un carattere diverso. Grazie a questa caratteristica la ricerca di parole o frasi all'interno di un testo può essere effettuata tramite confronto byte per byte; qualche precedente sistema di codifica basato su sequenze di lunghezza variabile di byte (per esempio [[Shift-JIS]]) non godeva di questa proprietà, rendendo gli [[Algoritmo|algoritmi]] di confronto tra stringhe complicati. Nonostante si possa obiettare che questa caratteristica aggiunga ridondanza alla codifica del testo, i vantaggi sono maggiori degli svantaggi; inoltre la compressione dei dati non è uno degli scopi di UTF-8, e va considerata separatamente. Infine, ancora grazie a questa proprietà, se uno o più byte andassero persi per errori di trasmissione o per corruzione dei dati, sarebbe possibile risincronizzare la decodifica all'inizio del carattere successivo, limitando i danni.
 
== Forme lunghe, ''input'' non valido e considerazioni di sicurezza ==
Il comportamento di un ''decoder'' in presenza di ''input'' non valido è pressoché indefinito. Ci sono molti modi in cui un ''decoder'' può reagire alla presenza di ''input'' non valido
 
# Inserire un carattere che rimpiazzi quello non valido (p.e. '?', '�')
# Saltare il carattere non valido
# Interpretare il carattere come proveniente da un altro [[:Categoria:Repertori di caratteri|Repertorio di caratteri]] (spesso [[Latin-1]])
# Ignorare l'errore e continuare come se il carattere fosse simile a qualche codice UTF-8 valido
# Segnalare un errore
 
I ''decoder'' potrebbero ovviamente comportarsi in modo diverso di fronte a diversi tipi di ''input'' non valido.
 
Tutte le possibilità hanno vantaggi e svantaggi, ma bisogna prestare particolare attenzione alla sicurezza se la verifica di validità dell'input viene compiuta prima della conversione da UTF-8.
 
Le forme lunghe (in cui un carattere viene codificato con più byte di quelli strettamente necessari, ma sempre nel rispetto delle regole precedenti) sono uno dei tipi di input che presentano maggiori problemi. Lo standard corrente prescrive che queste forme non vengano decodificate, ma specifiche più vecchie si limitavano a segnalare il problema, e molti ''decoder'' dei più semplici procedono alla decodifica senza nessun messaggio di avvertimento. Le forme lunghe sono state usate per scavalcare i controlli di sicurezza in prodotti di alto profilo, incluso il ''[[web server]]'' [[Internet Information Services]] (IIS) di [[Microsoft]]
 
Per mantenere la sicurezza nel caso di ''input'' non valido ci sono due opzioni. La prima è di decodificare il codice UTF-8 ''prima'' di fare qualsiasi controllo di validità necessario sull'''input''. La seconda è di usare un ''decoder'' più rigido, che nel caso di ''input'' non valido restituisca un errore o un testo che l'applicazione consideri innocuo.
 
== Vantaggi ==
Line 75 ⟶ 93:
* Alcuni caratteri di Unicode (per esempio l'alfabeto latino) occupano in UTF-8 un solo byte, altri richiedono fino a quattro byte. In generale un testo codificato in UTF-8 occuperà meno spazio del corrispondente [[UTF-16]] o [[UTF-32]] se contiene molti caratteri ASCII a 7 bit.
* Una sequenza di byte che codifica un carattere non può apparire come parte di una sequenza più lunga che codifica un altro carattere, come succedeva per codifiche a lunghezza variabile meno recenti (vedi la sezione precedente).
* Il primo byte di una sequenza è sufficiente a determinarne la lunghezza (è sufficiente contare il numero di bit più significativi con valore uno). Questo rende molto semplice estrarre una sotto-stringa da una stringa più lunga, senza bisogno di decodificare la sequenza di byte UTF-8.
* La maggioranza del [[software]] esistente (inclusi i [[Sistema_operativoSistema operativo|sistemi operativi]]) è stata scritta senza tener conto di Unicode, e l'uso di Unicode creerebbe problemi di compatibilità. Per esempio la libreria standard del [[Linguaggio_C|LinguaggioC (linguaggio)|C]] marca la fine di una stringa con un byte nullo (0x00). Usando UTF-16 il carattere Unicode "A" verrebbe codificato come 0x0041. LaIl libreriaprimo considererebbebyte ilverrebbe primotrattato bytecome il marcatore di fine stringa, e ignorerebbe il restosecondo e tutti i successivi verrebbero ignorati. UTF-8 è pensato in modo che nessuno dei byte codificati possa assumere uno dei valori speciali del codice ASCII, evitando questo e problemi simili.
* UTF-8 è la codifica predefinita per il formato [[XML]].
 
== Svantaggi ==
* UTF-8 usa sequenze di lunghezza variabile, cioè singoli caratteri possono venire rappresentati con sequenze di byte di lunghezze diverse.
* Gli ideogrammi vengono rappresentati in UTF-8 con tre byte, mentre ne richiedono solo due in UTF-16. Di conseguenza i testi in [[Lingua_cinese|Cinese]] /[[Lingua_giapponese|Giapponese]] / [[Lingua_coreana|Coreano]] occupano più spazio quando vengono codificati con UTF-8.
* Gli ideogrammi vengono rappresentati in UTF-8 con tre byte, mentre ne richiedono solo due in UTF-16. Di conseguenza i testi in [[Lingua cinese|Cinese]] / [[Lingua giapponese|Giapponese]] / [[Lingua coreana|Coreano]], oltre ad alcuni gruppi di caratteri Unicode meno noti, occupano più spazio rispetto alla codifica in UTF-16.
 
== StoriaNote ==
<references/>
UTF-8 è stato ideato da [[Ken Thompson]] e [[Rob Pike]] il [[2 settembre]] [[1992]] su una tovaglietta in una tavola calda del [[New Jersey]]. Il giorno dopo Pike e Thompson l'hanno implementato e hanno aggiornato [[Plan 9]], il loro [[Sistema operativo]], per usarlo.
 
== Voci correlate ==
UTF-8 è stato presentato ufficialmente nel gennaio del [[1993]] a [[San_Diego_(California)|San Diego]] in occasione della conferenza annuale di [[Usenix]].
* [[ASCII]]
* [[ASCII esteso]]
* [[Charset]]
* [[Ken Thompson]]
* [[Rob Pike]]
* [[Unicode]]
* [[UTF-16]]
* [[UTF-32]]
* [[UTF-7]]
 
== Altri progetti ==
{{interprogetto}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* [http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt Rob Pike racconta la creazione di UTF-8]
* {{FOLDOC}}
* [http://www.cs.bell-labs.com/sys/doc/utf.pdf L'articolo originale su UTF-8]
* {{cita web|https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt|Rob Pike racconta la creazione di UTF-8}}
* {{cita web |1=http://www.cs.bell-labs.com/sys/doc/utf.pdf |2=L'articolo originale su UTF-8 |accesso=2 dicembre 2004 |urlarchivio=https://web.archive.org/web/20050505032430/http://www.cs.bell-labs.com/sys/doc/utf.pdf# |dataarchivio=5 maggio 2005 |urlmorto=sì }}
* RFC 3629, Lo standard UTF-8
* RFC 2277, La politica della IETF sui set di caratteri e sui linguaggi
* [{{cita web|http://www.utf-8.com/ |UTF-8]}}
 
{{Tabella Unicode}}
{{portale|informatica}}
 
[[Categoria:Repertori di caratteri]]
[[cs:UTF-8]]
[[de:UTF-8]]
[[en:UTF-8]]
[[es:UTF-8]]
[[fr:UTF-8]]
[[he:UTF-8]]
[[hu:UTF-8]]
[[ja:UTF-8]]
[[nl:UTF-8]]
[[no:UTF-8]]
[[pl:UTF-8]]
[[pt:UTF-8]]
[[sk:UTF-8]]
[[sl:UTF-8]]
[[sv:UTF-8]]
[[tr:UTF-8]]