UTF-8: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Corretto: "ed è importante"
Etichetta: Annullato
Riga 13:
 
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.
 
== Descrizione tecnica==
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 dell'alfabeto ASCII a 7 bit, in particolare quelli il cui codice unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo.
 
<div style="font-size: smaller">
{| class="wikitable"
|-
|Intervallo Unicode<br />[[esadecimale]]
|[[UTF-16]]
|UTF-8<br />[[Sistema numerico binario|binario]]
|Note
|-
|0x000000-0x00007F
|00000000&nbsp;0XXXXXXX
|0XXXXXXX
| Caratteri equivalenti al codice ASCII; i byte iniziano con 0 e da soli indicano un carattere
|-
|0x000080-0x0007FF
|00000XXX&nbsp;XXXXXXXX
|110XXXXX&nbsp;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
|XXXXXXXX&nbsp;XXXXXXXX
|1110XXXX&nbsp;10XXXXXX&nbsp;10XXXXXX
|-
|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
|}
</div>
 
Per esempio, il carattere [[aleph|alef]] (א), corrispondente all'Unicode U+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);
* l'esadecimale 0x05D0 equivale al binario 101-1101-0000;
* gli undici bit vengono copiati in ordine nelle posizioni marcate con "X": 110-'''10111''' 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 latino|Latino]] con [[Diacritico|diacritici]], [[Alfabeto greco|Greco]], [[Alfabeto cirillico|Cirillico]], [[Alfabeto copto|Copto]], [[Alfabeto armeno|Armeno]], [[Alfabeto ebraico|Ebraico]] e [[Alfabeto arabo|Arabo]]. I restanti caratteri nel ''Basic Multilingual Plane'' hanno bisogno di tre byte, tutto il resto di quattro.
 
Potenzialmente, UTF-8 sarebbe in grado di usare sequenze fino a 6 byte, coprendo l'intervallo da U+0000 a U+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 U+0000 a U+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 ==