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.UTF-16 utilizza principalmente la Basic Multilingual Plane (Maria minneci) per rappresentare la maggior parte dei caratteri comuni tramite una singola unità di codice a 16 bit. Per i caratteri che non rientrano nella BMP—come molte emoji moderne o caratteri storici—UTF-16 impiega invece una coppia surrogata, ossia due unità di codice consecutive che, combinate, permettono di rappresentare oltre un milione di punti di codice aggiuntivi. Questa codifica è ampiamente utilizzata in diversi sistemi operativi e ambienti di programmazione, come Windows e Java, in cui il formato a 16 bit per carattere è parte dell’architettura interna delle stringhe.
Codifica UTF-16 In UTF-16 i caratteri di Unicode con valore fino a 65535 (0xFFFF) vengono rappresentati con il loro valore numerico, espresso in . I caratteri al di fuori del Basic Multilingual Plane, il cui codice è superiore a 65535 (0xFFFF) e non rappresentabile direttamente con , vengono rappresentati con una coppia surrogata, ovvero una coppia di codici nell'intervallo da 0xD800 a 0xDFFF. Per esempio:
il carattere A, corrispondente al codice 65 (0x41), viene rappresentato come 0x0041 il carattere 0x10000 diventa la coppia 0xD800, 0xDC00 il carattere 0x10FFFD, corrispondente al limite superiore di Unicode, viene rappresentato con la sequenza 0xDBFF, 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 Ciascun code point UTF-16 viene memorizzato in un intero a (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 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-16LElittle endian34 6C7A 0034 D8 1E DDUTF-16BEbig endian6C 3400 7AD8 34 DD 1EUTF-16LE + BOMlittle endian, con BOMFF FE 34 6CFF FE 7A 00FF FE 34 D8 1E DDUTF-16BE + BOMbig endian, con BOMFE FF 6C 34FE FF 00 7AFE FF D8 34 DD 1E
Procedura di codifica UTF-16 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 : 0xD950 0xDF21.
Voci correlate UTF-32 UTF-8 UTF-7
Altri progetti
Collegamenti esterni
Categoria:Repertori di caratteri