UTF-16: diferenças entre revisões
Tá quase |
|||
Linha 46: | Linha 46: | ||
Hoje em dia, UTF-16 é a representação nativa de texto no [[Microsoft Windows]] e na [[Linguagem de programação Java]]. |
Hoje em dia, UTF-16 é a representação nativa de texto no [[Microsoft Windows]] e na [[Linguagem de programação Java]]. |
||
Ele é um formato de transformação de [[Unicode]] 16 bits, que permite a representação de séries de caracteres abstratos do Unicode e do ISO/IEC 10646, como uma série de palavras de 16 bits convenientes para armazenagem e transmissão via [[redes de computadores]]. UTF-16 é oficialmente definido no Annex Q of ISO/IEC 10646-1. Também é descrito no "The Unicode Standard version 3.0 and higher", assim como no RFC 2781 da IETF. |
|||
==Exemplos em UTF-16== |
|||
<table border="1"> |
|||
<tr><th>identificador do caractere</th><th>caractere</th><th>código UTF-16 </th><th>exemplo de [[glifo]]*</th></tr> |
|||
<tr> |
|||
<td>122 (hexa 7A)</td><td>Z minúsculo (latino)</td><td>007A</td><td>z</td> |
|||
</tr> |
|||
<tr> |
|||
<td>946 (hexa 3B2)</td><td>Beta minúsculo (grego)</td><td>03B2</td><td>β</td> |
|||
</tr> |
|||
<tr> |
|||
<td>27700 (hexa 6C34)</td><td>água (chinês)</td><td>6C34</td><td>水</td> |
|||
</tr> |
|||
<tr> |
|||
<td>119070 (hexa 1D11E)</td><td>clave de sol</td><td>D834 DD1E</td><td>𝄞</td> |
|||
</tr> |
|||
</table> |
|||
''* Pode ser necessário que você configure seus programas e instale [[fonte]]s para ver corretamente os glifos'' |
|||
==Exemplos de serializações nos três esquemas UTF-16== |
|||
{| border="1" cellpadding="5" cellspacing="0" align="center" |
|||
|+'''Serializações''' |
|||
|- |
|||
! style="background:#efefef;" | mensagem |
|||
! style="background:#efefef;" | Unicode |
|||
! style="background:#efefef;" | UTF-16 (l) |
|||
! style="background:#efefef;" | UTF-16 (b) |
|||
! style="background:#efefef;" | UTF-16LE |
|||
! style="background:#efefef;" | UTF-16BE |
|||
|- |
|||
| z β 水 || 00007A 0003B2 006C34 || FF FE 7A 00 B2 03 34 6C || FE FF 00 7A 03 B2 6C 34 || 7A 00 B2 03 34 6C || 00 7A 03 B2 6C 34 |
|||
|- |
|||
| z 𝄞 || 00007A 01D11E || FF FE 7A 00 34 D8 1E DD || FE FF 00 7A D8 34 DD 1E || 7A 00 34 D8 1E DD || 00 7A D8 34 DD 1E |
|||
|- |
|||
|} |
|||
===Example UTF-16 Encoding Procedure=== |
|||
The character at code point 64321 (hexadecimal) is to be encoded. Since it is above FFFF, it must be encoded with a surrogate pair, as follows: |
|||
v = 0x64321 |
|||
v′ = v - 0x10000 |
|||
= 0x54321 |
|||
= 0101 0100 0011 0010 0001 |
|||
vh = 0101010000 // higher 10 bits of v′ |
|||
vl = 1100100001 // lower 10 bits of v′ |
|||
w1 = 0xD800 // the resulting 1st word is initialized with the lower bracket |
|||
w2 = 0xDC00 // the resulting 2nd word is initialized with the lower bracket |
|||
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 |
|||
The correct encoding for this character is thus the following word sequence: |
|||
0xD950 0xDF21 |
|||
[[Category:Character sets]] |
|||
[[Category:Unicode]] |
|||
[[de:UTF-16]] |
|||
[[fr:UTF-16]] |
|||
[[he:UTF-16]] |
|||
[[pl:UTF-16]] |
|||
[[sk:UTF-16]] |
|||
[[categoria:Informática]] |
|||
[[categoria:Codificação]] |
[[categoria:Codificação]] |
Revisão das 12h38min de 18 de janeiro de 2005
{{{1}}}
Em computação, UTF-16 é um "Formato de Transformação Unicode" de 16-bits. Um formato de tranformação Unicode é uma codificação de caracteres que provê uma maneira de representar os diversos caracteres abstratos, presentes no Unicode e no ISO/IEC 10646, como uma série de palavras de 16-bits, para então poder ser armazenados ou transmitidos por uma rede. A codificação UTF-16 é oficialmente definida no Anexo Q do padrão ISO/IEC 10646-1. É também descrita em "The Unicode Standard", versões 3.0 e superiores, bem como no RFC 2781.
Para os caracteres que tenham recebido um identificador entre 0 e 65535 nas listas Unicode ou ISO/IEC 10646, a codificação UTF-16 representa-os simplesmente como um número idêntico ao seu código. Por exemplo, o código UTF-16 do caractere identificado por 0 é 0. O código UTF-16 do caractere identificado pelo número hexadecimal FFFD é FFFD.
No caso dos valores maiores que 65535 (número hexadecimal FFFF), o UTF-16 representa-os como um par de códigos, cada um deles valendo desde D800 até DFFF (isto é possível porque não existe nenhum caractere atribuído a esta série de números, que são menores que FFFF). O primeiro caractere a representar, maior que FFFF é o 10000. Para este é atribuído o código D800 DC00. Para o caractere 10001, o código é D800 DC01. O último caractere Unicode definido, que é o 10FFFD, vira o valor DBFF DC00. O algoritmo que retorna corretamente o código UTF-16 de um dado "caractere alto" é o seguinte:
Hipótese: ultimo caractere ISO/IEC 10646 Z = 10FFFD Seja U: caractere ISO/IEC 10646 que queremos passar para UTF-16 (U tem 21 bits)
U' := U - 0x10000 (U' tem 20 bits) uh := dez bits altos de U' (uh tem 10 bits) ul := dez bits baixos de U' (ul tem 10 bits)
vh := uh estendido para 16 bits (colocados zeros à esquerda) vl := vh estendido para 16 bits (colocados zeros à esquerda) utf16,1 := 0xD800 | vh utf16,2 := 0xDC00 | vl
Após a execução do algoritmo, o código UTF-16 é composto de utf16,1 e utf16,2.
Dado o código UTF-16 (seja com 16, seja com 32 bits), este há de ser "serializado", isto é, seus bits colocados em alguma ordem bem definida. Devido às diferenças de arquitetura de computadores, especificam-se três formas de serialização: UTF-16, UTF-16LE e UTF-16BE.
O esquema UTF-16 de serialização requer que a ordem de bytes seja declarada com um comando Byte Order Mark antes do primeiro caractere serializado. O comando BOM é representado pela codificação UTF-16 do caractere "Zero-Width No-Break Space", que tem o código FEFF, no começo da mensagem. Numa máquina little-endian, este código é serializado como FF FE (isto é o primeiro byte a ser armazenado ou transmitido é o FF, após este, FE), enquanto numa máquina big-endian, como FE FF. Um BOM no início de um texto UTF-16, encontrado por um desserializador UTF-16 é tratado como um comando e não é incluído como parte da mensagem.
Os esquemas UTF-16LE e UTF-16BE, em vez de utilizarem um comando, simplesmente assumem implicitamente uma das formas de operação. Este serializa em big-endian e aquele, em little-endian. Um código BOM no começo da mensagem faz, portanto, parte da própria mensagem.
A IANA aprovou as codificações UTF-16, UTF-16BE e UTF-16LE para uso na Internet, com exatamente estes nomes (sem diferenciar maiúsculas ou minúsculas). As variações UTF_16 ou UTF16 podem significar o mesmo em certas linguagens de programação ou certos programas, mas não são considerados padrões.
Hoje em dia, UTF-16 é a representação nativa de texto no Microsoft Windows e na Linguagem de programação Java.
Exemplos em UTF-16
identificador do caractere | caractere | código UTF-16 | exemplo de glifo* |
---|---|---|---|
122 (hexa 7A) | Z minúsculo (latino) | 007A | z |
946 (hexa 3B2) | Beta minúsculo (grego) | 03B2 | β |
27700 (hexa 6C34) | água (chinês) | 6C34 | 水 |
119070 (hexa 1D11E) | clave de sol | D834 DD1E | 𝄞 |
* Pode ser necessário que você configure seus programas e instale fontes para ver corretamente os glifos
Exemplos de serializações nos três esquemas UTF-16
mensagem | Unicode | UTF-16 (l) | UTF-16 (b) | UTF-16LE | UTF-16BE |
---|---|---|---|---|---|
z β 水 | 00007A 0003B2 006C34 | FF FE 7A 00 B2 03 34 6C | FE FF 00 7A 03 B2 6C 34 | 7A 00 B2 03 34 6C | 00 7A 03 B2 6C 34 |
z 𝄞 | 00007A 01D11E | FF FE 7A 00 34 D8 1E DD | FE FF 00 7A D8 34 DD 1E | 7A 00 34 D8 1E DD | 00 7A D8 34 DD 1E |
Example UTF-16 Encoding Procedure
The character at code point 64321 (hexadecimal) is to be encoded. Since it is above FFFF, it must be encoded with a surrogate pair, as follows:
v = 0x64321 v′ = v - 0x10000 = 0x54321 = 0101 0100 0011 0010 0001
vh = 0101010000 // higher 10 bits of v′ vl = 1100100001 // lower 10 bits of v′ w1 = 0xD800 // the resulting 1st word is initialized with the lower bracket w2 = 0xDC00 // the resulting 2nd word is initialized with the lower bracket 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
The correct encoding for this character is thus the following word sequence:
0xD950 0xDF21