Relação entre unicode e UTF-8/16/32

1

Eu não entendo a relação entre o UTF-8 e suas outras variantes e estou obtendo resultados anômalos no terminal. Por exemplo, a seta para a direita é:

0xE2 0x86 0x92 em UTF-8

mas é

0x2192 em UTF-16 em UTF-16 e Unicode

Eu não entendo como E28692 é equivalente a 2192.

Além disso, a versão UTF-8 parece não funcionar no meu terminal linux, que usa codificação UTF-8 com fonte DejaVu que suporta unicode. Por exemplo, se eu entrar

echo -e "\u2192"

Então eu recebo uma flecha, ótimo, correto, funciona. Mas, se eu entrar

echo -e "\xe2\x86\x92" ou

echo -e "\x00\x00\x21\x92"

Então recebo gráficos incorretos. Por que minhas sequências hexagonais estão erradas?

    
por Tyler Durden 14.10.2014 / 12:51

2 respostas

2

Unicode é um conjunto de caracteres. UTF são codificações.

O Unicode define um conjunto de caracteres com pontos de código correspondentes, isto é. valores que identificam inequivocamente caracteres no conjunto de caracteres Unicode.

Por exemplo, de acordo com unicode-table.com U+0041 corresponde ao capital A, U+03A3 é sigma do capital grego (Σ) e U+2603 é um boneco de neve (☃). U+ números são pontos de código. O Unicode nos diz qual símbolo corresponde a qual ponto de código, mas não nos diz como codificar esses pontos de código em bytes.

É aqui que o UTF (Unicode Transformation Format) entra em cena. UTF é uma codificação: mapeia pontos de código Unicode para sequências de bytes não ambíguas.

  • O UTF-32 é a codificação "burra". Todos os pontos de código Unicode têm no máximo 4 bytes de comprimento, portanto, o UTF-32 simplesmente interpreta o ponto de código como um número de 4 bytes (32 bits, daí o nome) com ordem de bytes big endian . Então, U+2603 é codificado como 0x00002603 .

    O UTF-32 é muito simples, mas também muito redundante. Os caracteres mais usados caem no intervalo ASCII e são representados por pontos de código 0-127 em Unicode, portanto, em arquivos codificados em UTF-32, quase 3 em 4 bytes serão zeros. Quase toda sentença inglesa se torna 4 vezes mais longa (em bytes) quando codificada em UTF-32 em vez de ASCII.

  • O UTF-8 (muito comum na Internet) usa apenas 1 byte para caracteres ASCII, por isso não introduz nenhuma sobrecarga em arquivos somente ASCII (cada arquivo ASCII também é um arquivo UTF-8 com o arquivo ASCII). mesmo conteúdo). Outros caracteres requerem até 6 bytes.

  • O UTF-16 (usado pelo Windows, apenas para citar um exemplo) é um compromisso entre o UTF-32 e o UTF-8. Pontos de código são codificados para sequências de 16 ou 32 bits. É mais redundante que UTF-8 na maioria dos casos, mas mais fácil de manter e mais rápido de processar.

Caracteres diferentes podem ter diferentes representações em diferentes codificações UTF-x. Por exemplo, as seqüências UTF-8 podem atingir até 6 bytes, enquanto as seqüências UTF-16 têm no máximo 4 bytes, embora ambas codifiquem o mesmo conjunto de caracteres (Unicode). Codificações mais refinadas (UTF-8) usam mais bits para indicar o comprimento da seqüência, portanto, para valores codificados altos, os valores codificados são mais longos e menos ideais.

A resposta de dsolimano explica o comportamento do seu shell.

    
por 14.10.2014 / 17:34
1

Pontos de código Unicode codificados em UTF-8

Eles são equivalentes por causa do link , veja o algoritmo para converter pontos de código Unicode em UTF- 8 É assim.

Seu ponto de código 0x2192 está entre U + 0800 e U + FFFF. Então, usamos a terceira linha da tabela.

                         Byte 1     Byte 2      Byte 3
16  U+0800  U+FFFF  3   1110xxxx    10xxxxxx    10xxxxxx

0x2192 no binário é 0010 0001 1001 0010 . Vamos ligar isso e depois converter de volta para hexadecimal

16  U+0800  U+FFFF  3   11100010    10000110    10010010
                    3   E   2       8   6       9   2

E28692 em outras palavras.

Sequências de escape no seu shell

Agora, por que seu shell não exibe a seta para a direita quando você digita uma sequência UTF-8, vamos dar uma olhada no manual do bash . Procure a seção sobre a seqüência de escape \xHH e você vai descrevê-la como

the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)

Então você está pedindo ao bash para exibir três sequências separadas de dois caracteres, provavelmente dando a você algo como LETRA LETRA PEQUENA A COM CIRCUMFLEX , INÍCIO DA ÁREA SELECIONADA , e um caráter de uso particular de algum tipo.

    
por 14.10.2014 / 16:32