UTF-16
UTF-16 (Unicode Transformation Format, 16 bit) è una codifica di caratteri Unicode in sequenze di numeri a 16-bit. UTF-16 è definito ufficialmente nell'allegato Q dello standard ISO/IEC 10646, e viene descritto nella versione 3.0 e successive de "the Unicode standard", oltre che nel documento RFC 2781 della IETF.
Codifica UTF-16
[modifica | modifica wikitesto]In UTF-16 i caratteri di Unicode con valore fino a 65535
(0xFFFF
) vengono rappresentati con il loro valore numerico, espresso in 16 bit. I caratteri al di fuori del Basic Multilingual Plane, il cui codice è superiore a 65535
(0xFFFF
) e non rappresentabile direttamente con 16 bit, vengono rappresentati con una coppia surrogata, ovvero una coppia di codici nell'intervallo da 0xD800
a 0xDFFF
. Per esempio:
- il carattere
A
, corrispondente al codice65
(0x41
), viene rappresentato come0x0041
- il carattere
0x10000
diventa la coppia0xD800, 0xDC00
- il carattere
0x10FFFD
, corrispondente al limite superiore di Unicode, viene rappresentato con la sequenza0xDBFF, 0xDFFD
.
Unicode non assegna a nessun carattere un valore compreso tra 0xD800
e 0xDFFF
, evitando in questo modo che i singoli elementi di una coppia surrogata possano essere confusi con un carattere Unicode valido.
Varianti di UTF-16
[modifica | modifica wikitesto]Ciascun code point UTF-16 viene memorizzato in un intero a 16 bit (uint16). Dato che l'ordine dei byte in una parola varia a seconda dell'architettura del calcolatore, UTF-16 prevede tre schemi di codifica, UTF-16, UTF-16LE (Little Endian) e UTF-16BE (Big Endian).
La codifica UTF-16 impone che l'ordine dei byte venga dichiarato esplicitamente aggiungendo un Byte Order Mark come prefisso di ogni testo codificato. Il BOM è la forma codificata del carattere Zero width, non breaking space, corrispondente all'esadecimale 0xFEFF
, rappresentato come 0xFE,0xFF
sui sistemi big endian e 0xFF, 0xFE
sui sistemi little endian.
Le codifiche UTF-16BE e UTF-16LE sono identiche alla codifica UTF-16, con l'eccezione che l'ordine dei byte è implicito, big endian per UTF-16BE, e little endian per UTF-16LE. Il carattere 0xFEFF
all'inizio di un testo rappresentato con una di queste due codifiche viene considerato parte del testo anziché come BOM.
La IANA ha approvato i nomi UTF-16, UTF-16BE e UTF-16LE, indifferentemente maiuscoli o minuscoli, per l'uso su Internet. I nomi UTF_16 o UTF16, comunemente usati, potrebbero essere riconosciuti da specifici linguaggi di programmazione o applicazioni, ma non sono ufficialmente validi.
UTF-16 è la rappresentazione nativa del testo per le versioni di Windows basate su NT, per il linguaggio di programmazione Java e per gli ambienti .NET e macOS Cocoa e Core.
Esempi
[modifica | modifica wikitesto]Carattere Unicode | Nome | Codici UTF-16 | Carattere |
---|---|---|---|
122 (esadecimale 0x7A )
|
Z minuscola (alfabeto latino) | 007A
|
z |
27700 (esadecimale 0x6C34 )
|
acqua (Cinese) | 6C34
|
水 |
119070 (esadecimale 0x1D11E )
|
chiave di Sol | D834 DD1E
|
𝄞 |
Tipo di codifica | Ordine dei byte | Sequenza dei byte in memoria | ||
---|---|---|---|---|
水 | z | 𝄞 | ||
UTF-16LE | little endian | 34 6C
|
7A 00
|
34 D8 1E DD
|
UTF-16BE | big endian | 6C 34
|
00 7A
|
D8 34 DD 1E
|
UTF-16LE + BOM | little endian, con BOM | FF FE 34 6C
|
FF FE 7A 00
|
FF FE 34 D8 1E DD
|
UTF-16BE + BOM | big endian, con BOM | FE FF 6C 34
|
FE FF 00 7A
|
FE FF D8 34 DD 1E
|
Procedura di codifica UTF-16
[modifica | modifica wikitesto]Supponiamo di voler codificare il carattere U+64321
(esadecimale 0x64321
). Essendo superiore a 0xFFFF
deve essere rappresentato con una coppia surrogata, in questo modo:
v = 0x64321 v′ = v - 0x10000 = 0x54321 = 0101 0100 0011 0010 0001
vh = 0101010000 // 10 bit alti di v′ vl = 1100100001 // 10 bit bassi di v′ w1 = 0xD800 // w1 e w2 vengono inizializzati con la prima coppia surrogata w2 = 0xDC00 w1 = w1 | vh = 1101 1000 0000 0000 | 01 0101 0000 = 1101 1001 0101 0000 = 0xD950
w2 = w2 | vl = 1101 1100 0000 0000 | 11 0010 0001 = 1101 1111 0010 0001 = 0xDF21
La rappresentazione del carattere U+64321
è quindi la seguente coppia di parole di 16 bit: 0xD950 0xDF21
.
Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]Wikimedia Commons contiene immagini o altri file sull'UTF-16
Collegamenti esterni
[modifica | modifica wikitesto]- Unicode Technical Note #12: UTF-16 for Processing, su unicode.org.