UTF-8: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m fix
mNessun oggetto della modifica
 
(31 versioni intermedie di 29 utenti non mostrate)
Riga 1:
'''UTF-8''' (Unicode Transformation Format, 8 bit) è una [[codifica deidi 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]].
{{Avvisounicode}}
{{Tabella Unicode}}
'''UTF-8''' (Unicode Transformation Format, 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 (informatica)|bit]].
 
== Cenni storiciStoria ==
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 [[UsenixUSENIX]].
 
== Caratteristiche generali ==
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 eed è importante una ridotta occupazione di memoria è importante, si potrebbe utilizzare lo [[Schema di compressione standard per Unicode]].
 
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.
Line 20 ⟶ 18:
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 dell'alfabeto ASCII a 7 bit, in particolare quelli il cui codice unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo.
 
<small>
{| class="wikitable"
|-
|!Intervallo Unicode<br />[[esadecimale]]
|![[UTF-16]]
|!UTF-8<br />[[Sistema numerico binario|binario]]
|!Note
|-
|0x000000-0x00007F
Line 43 ⟶ 40:
|-
|0x010000-0x10FFFF
|110110XX&nbsp;XXXXXXXX<br />110111XX&nbsp;XXXXXXXX
|11110XXX&nbsp;10XXXXXX&nbsp;10XXXXXX&nbsp;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]] (א), corrispondente all'Unicode U+05D0, viene rappresentato in UTF-8 con questo procedimento:
Line 53 ⟶ 49:
* ricade nell'intervallo da 0x0080 a 0x07FF. Secondo la tabella verrà rappresentato con due byte (110XXXXX 10XXXXXX);
* l'esadecimale 0x05D0 equivale al binario 101-1101-0000;
* gli undici bit vengono copiati in ordine nelle posizioni marcate con "xX": 110-'''10111''' 10-'''010000''';
* il risultato finale è la coppia di byte 11010111 10010000, o in esadecimale 0xD7 0x90.
 
Line 61 ⟶ 57:
 
== UTF-8 Modificato ==
Il [[linguaggio di programmazione Java]], che usa UTF-16 come rappresentazione interna dei caratteri, usa per la loro serializzazione su file una variazione non standard di UTF-8<ref>{{cita web|url=httphttps://download.oracle.com/javase/6/docs/api/java/io/DataInput.html#modified-utf-8|titolo=Documentazione della classe <ttcode>java.io.DataInput</ttcode>, sezione "Modified UTF-8"|accesso=4 maggio 2011}}</ref>.
 
Ci sono due differenze tra la codifica UTF-8 standard e quella modificata. La prima differenza è che il carattere nullo (U+0000) viene rappresentato con due byte anziché uno, nello specifico come 11000000 10000000 (0xC0 0x80). In questo modo ci si assicura che nessuna stringa codificata venga troncata prematuramente perché contenente il byte ''null'' (0x00), interpretato da alcuni linguaggi di programmazione (ad esempio il [[Linguaggio C|C]]) come terminatore della stringa.
Line 74 ⟶ 70:
* 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 UnicodeUTF-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 ==
Line 102 ⟶ 98:
 
== Svantaggi ==
* UTF-8 usa sequenze di lunghezza variabile, cioè singoli caratteri differentipossono vengonovenire rappresentati con sequenze di byte di lunghezze diverse. La gravità del problema tuttavia potrebbe essere limitata creando un'interfaccia astratta che lavori con le stringhe UTF-8, e rendendola completamente trasparente all'utente. Inoltre anche UTF-16 usa sequenze di lunghezza variabile, anche se molti non lo sanno (o non sono interessati ai caratteri al di fuori del ''Basic Multilingual Plane'').
* 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 quandorispetto vengonoalla codificaticodifica conin UTF-816.
* Un ''decoder'' mal programmato (e non conforme alle ultime versioni dello standard) potrebbe accettare diverse pseudo-codifiche UTF-8 e convertirle nello stesso carattere Unicode, scavalcando in questo modo eventuali controlli di sicurezza progettati per lavorare su rappresentazioni dei dati a 8 bit.
* 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 quando vengono codificati con UTF-8.
 
== Note ==
Line 119 ⟶ 114:
* [[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]
* [http{{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}}