UTF-16: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
LeonardoG (discussão | contribs)
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>&#946;</td>
</tr>
<tr>
<td>27700 (hexa 6C34)</td><td>água (chinês)</td><td>6C34</td><td>&#27700;</td>
</tr>
<tr>
<td>119070 (hexa 1D11E)</td><td>clave de sol</td><td>D834 DD1E</td><td>&#119070;</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 &#946; &#27700; || 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 &#119070; || 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&prime; = v - 0x10000
= 0x54321
= 0101 0100 0011 0010 0001

vh = 0101010000 // higher 10 bits of v&prime;
vl = 1100100001 // lower 10 bits of v&prime;
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 caracterecaracterecódigo UTF-16 exemplo de glifo*
122 (hexa 7A)Z minúsculo (latino)007Az
946 (hexa 3B2)Beta minúsculo (grego)03B2β
27700 (hexa 6C34)água (chinês)6C34
119070 (hexa 1D11E)clave de solD834 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

Serializações
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