Por que existem várias codificações Unicode?

40

Eu achei que o Unicode foi projetado para contornar toda a questão de ter muita codificação diferente devido a um pequeno espaço de endereço (8 bits) na maioria das tentativas anteriores (ASCII, etc.).

Por que existem tantas codificações Unicode? Mesmo múltiplas versões do (essencialmente) mesmo, como UTF-8, UTF-16, etc.

    
por Matthew Scharley 20.05.2011 / 07:22
fonte

8 respostas

28

Porque as pessoas não querem gastar 21 bits em cada personagem. Em todos os sistemas modernos, isso significaria essencialmente usar três bytes por caractere, o que é três vezes mais do que as pessoas estavam acostumadas, então eles não estavam dispostos a adotar o Unicode. Compromissos tiveram que ser encontrados: por ex. O UTF-8 é ótimo para texto em inglês porque arquivos ASCII herdados não precisam ser convertidos, mas são menos úteis para idiomas europeus e de pouca utilidade para idiomas asiáticos.

Então, basicamente, sim, poderíamos ter definido uma única codificação universal, bem como um único gráfico de caracteres universal, mas o mercado não teria aceitado isso.

    
por 20.05.2011 / 12:26
fonte
37

Unicode é um caracter de 21 bits que codifica a descrição exclusiva de "CodePoints", cada um dos pontos de código sendo representado por um a um glifo (uma representação gráfica).

  • 16 bits usados para identificar um ponto de código em um plano (a maioria dos pontos de código está no plano 0).
  • 5 bits para identificar o plano.

As codificações suportadas são:

  • UTF-8 (para codificar cada ponto usando valores de 8 bits)
  • UTF-16 (para codificar cada ponto usando valores de 16 bits)
  • UTF-32 (para codificar cada ponto usando valores de 32 bits)

Mas não importa a codificação quando você decodifica, todos eles mapeiam de volta para um ponto de código específico que tenha o mesmo significado (e é por isso que é legal).

UTF-8

Este é um formato de tamanho variável. Onde cada codepoint é representado por 1 a 4 bytes.

UTF-16

Este é um formato de tamanho variável. Os pontos de código no "Plano Multilingue Básico" (BMP ou Plano 0) podem ser representados por um único valor de 16 bits. Pontos de código em outros planos são representados por um par substituto (2 valores de 16 bits).

UTF-32

Este é um formato de tamanho fixo. Todos os pontos de código são representados por um único valor de 32 bits.

    
por 20.05.2011 / 07:49
fonte
25

Acho útil separar as duas ideias:

  1. Unicode - mapeamento de caracteres de todo o mundo para pontos de código.
  2. Codificação - mapeamento de pontos de código para padrões de bits (UTF-8, UTF-16, etc.).

UTF-8, UTF-16 e outras codificações têm suas próprias vantagens e desvantagens. Melhor consultar Wikipedia sobre isso.

    
por 20.05.2011 / 07:36
fonte
9

UTF-7, UTF-8, UTF-16 e UTF-32 são simplesmente formatos de transformação algorítmica da mesma codificação (codepoints) de caracteres. Eles são codificações de um sistema de codificação de caracteres.

Eles também são algoritmicamente mais fáceis de navegar para frente e para trás do que a maioria dos esquemas anteriores para lidar com conjuntos de caracteres maiores que 256 caracteres.

Isso é muito diferente da codificação de glifos em geral do país e às vezes do fornecedor. Somente em japonês, havia uma tonelada de variações do JIS sozinho, sem mencionar o EUC-JP e a transformação orientada por páginas de código do JIS que máquinas DOS / Windows usavam, chamadas Shift-JIS. (Até certo ponto, havia transformações algorítmicas, mas não eram particularmente simples e havia diferenças específicas de fornecedores em caracteres disponíveis. Multiplique isso por algumas centenas de países e a evolução gradual de sistemas de fontes mais sofisticados (post greenscreen). era), e você teve um verdadeiro pesadelo.

Por que você precisaria dessas formas de transformação do Unicode? Como muitos sistemas legados assumiram sequências de caracteres ASCII de 7 bits, você precisou de uma solução limpa de 7 bits que passasse dados não corrompidos com segurança através desses sistemas, então você precisaria do UTF-7. Em seguida, havia sistemas mais modernos que podiam lidar com conjuntos de caracteres de 8 bits, mas os nulos geralmente tinham significados especiais para eles, portanto, o UTF-16 não funcionava para eles. 2 bytes poderiam codificar todo o plano básico multilíngue do Unicode em sua primeira encarnação, de modo que o UCS-2 parecia uma abordagem razoável para sistemas que seriam "conscientes do Unicode desde o início" (como o Windows NT e o Java VM); então as extensões além disso exigiam caracteres adicionais, o que resultou na transformação algorítmica dos 21 bits de codificações que eram reservadas pelo padrão Unicode, e pares substitutos nasceram; que exigiu UTF-16. Se você tivesse algum aplicativo em que a consistência da largura de caracteres fosse mais importante que a eficiência de armazenamento, o UTF-32 (uma vez chamado de UCS-4) era uma opção.

O UTF-16 é a única coisa que é remotamente complexa de lidar, e que é facilmente atenuada pela pequena variedade de caracteres que são afetados por essa transformação e pelo fato de que as sequências de 16 bits principais estão nitidamente em um intervalo totalmente distinto das seqüências de 16 bits à direita. Também é mais fácil do que tentar avançar e retroceder em muitas codificações do leste asiático, onde você precisou de uma máquina de estado (JIS e EUC) para lidar com as sequências de escape ou potencialmente recuperar vários caracteres até encontrar algo garantido para ser apenas um byte de chumbo (Shift-JIS). O UTF-16 tinha algumas vantagens em sistemas que também conseguiam sequências de 16 bits com eficiência.

A menos que você tenha que passar por dezenas (centenas, na verdade) de diferentes codificações, ou tenha que construir sistemas que suportem múltiplos idiomas em diferentes codificações, às vezes até no mesmo documento (como o WorldScript nas versões antigas do MacOs), Você pode pensar nos formatos de transformação unicode como complexidade desnecessária. Mas é uma redução drástica na complexidade sobre as alternativas anteriores, e cada formato resolve uma restrição técnica real. Eles também são realmente eficientes conversíveis entre si, não exigindo tabelas de pesquisa complexas.

    
por 20.05.2011 / 08:16
fonte
6

O Unicode não foi projetado para contornar toda a questão de ter várias codificações diferentes.

O Unicode foi projetado para contornar toda a edição de um número que representa muitas coisas diferentes, dependendo da página de código em uso. Os números de 0 a 127 representam os mesmos caracteres em qualquer página de códigos do Ansi. Isso é o que também é conhecido como gráfico ou conjunto de caracteres ASCII. Nas páginas de códigos Ansi, que permitem 256 caracteres, os números 128 - 255 representam caracteres diferentes em páginas de código diferentes.

Por exemplo

  • O número $ 57 representa um W maiúsculo em todas as páginas de código, mas
  • O número $ EC representa o símbolo de inifinidade na página de códigos 437 (US), mas uma "LETRA PEQUENA N COM CEDILA" na página de códigos 775 (Báltico)
  • O sinal de centavo é o número $ 9B na página de código 437, mas o número 96 na página de código 775

O que Unicode fez foi virar tudo de cabeça para baixo. Em Unicode não há "reutilização". Cada número representa um único caractere único. O número $ 00A2 em Unicode é o sinal de centavo e o sinal de centavo não aparece em nenhum outro lugar na definição Unicode.

Why then are there so many Unicode encodings? Even multiple versions of the (essentially) same one, like UTF-8, UTF-16, etc.

Não há várias versões da mesma codificação. Existem várias codificações do mesmo mapa de definição de caracteres Unicode e elas foram "inventadas" para administrar os requisitos de armazenamento para diferentes usos dos vários planos linguais existentes no Unicode.

Unicode define (ou tem espaço para definir) 4.294.967.295 caracteres únicos. Se você quiser mapeá-los para o armazenamento em disco / memória sem fazer nenhuma conversão algorítmica, precisará de 4 bytes por caractere. Se você precisar armazenar textos com caracteres de todos os planos linguais, então UTF-32 (que é basicamente uma codificação de armazenamento de 1 caractere - 4 bytes da definição de unicode) é provavelmente o que você precisa.

Mas quase nenhum texto usa caracteres de todos os planos linguais. E então usar 4 bytes por caractere parece um grande desperdício. Especialmente quando você leva em conta que a maioria das linguagens do mundo é definida dentro do que é conhecido como o Basic Multi-lingual Plane (BMP): os primeiros 65536 números da definição Unicode.

E é aí que o UTF-16 entrou. Se você usar apenas caracteres do BMP, o UTF-16 armazenará isso de forma muito eficiente usando apenas dois bytes por caractere. Ele usará apenas mais bytes para caracteres fora do BMP. A distinção entre UTF-16LE (Little Endian) e UTF-16BE (Big Endian) realmente tem algo a ver com como os números são representados na memória do computador (padrão de byte A0 hexadecimal $ A0 ou $ 0A).

Se o seu texto usar ainda menos caracteres diferentes, como a maioria dos textos em idiomas da Europa Ocidental, você deverá restringir ainda mais os requisitos de armazenamento para seus textos. Daí UTF-8, que usa um único byte para armazenar os caracteres presentes no gráfico ASCII (os primeiros 128 números) e uma seleção dos caracteres Ansi (os segundos 128 números das várias páginas de código). Ele usará somente mais bytes para caracteres fora desse conjunto de "caracteres mais usados".

Então, para recapitular:

  • Unicode é um mapeamento dos caracteres em todas as linguagens do mundo (e alguns klingons para serem inicializados) e alguns (matemáticos, musicais, etc.) para um número único.
  • Codificações são algoritmos definidos para armazenar textos usando os números desse mapa de caractere único como espaço eficientemente possível, considerando o "uso médio" de caracteres em textos.
por 20.05.2011 / 08:42
fonte
2

Unicode define o mapa entre números e caracteres. No entanto, quando você envia um número para um receptor, ainda precisa definir como representar esse número. É para isso que o UTF é. Define como representar um número em um fluxo de bytes.

    
por 20.05.2011 / 07:38
fonte
2

A lógica por trás do UTF-32 é simples: é a representação mais direta dos pontos de código Unicode. Então, por que não é tudo em UTF-32? Duas razões principais:

Um é tamanho . O UTF-32 requer 4 bytes para cada caractere. Para o texto que usa apenas caracteres no Local Multilingue Básico, esse é o dobro do espaço que o UTF-16. Para texto em inglês, é 4 vezes mais espaço que o US-ASCII.

O maior motivo é compatibilidade com versões anteriores . Cada codificação Unicode diferente do UTF-32 "não codificado" foi projetada para compatibilidade retroativa com um padrão anterior.

  • UTF-8: Compatibilidade retroativa com o US-ASCII.
  • UTF-16: compatibilidade retroativa com o UCS-2 (Unicode de 16 bits antes de ser expandido além do BMP).
  • UTF-7: Compatibilidade retroativa com servidores de e-mail não limpos de 8 bits.
  • GB18030: Compatibilidade retroativa com as codificações GB2312 e GBK para chinês.
  • UTF-EBCDIC: Compatibilidade retroativa com o subconjunto Latin básico de EBCDIC.

I thought Unicode was designed to get around the whole issue of having lots of different encoding

Foi, e aconteceu. É muito mais fácil converter entre UTF-8, -16 e -32 do que lidar com o antigo sistema de centenas de diferentes codificações de caracteres para diferentes idiomas e sistemas operacionais diferentes.

    
por 11.06.2011 / 09:02
fonte
1

Você sabe que um arquivo zip pode compactar um arquivo para ser muito menor (especialmente texto) e, em seguida, descompactá-lo para uma cópia idêntica do arquivo original.

O algoritmo de compactação tem vários diferentes algoritmos com diferentes características para escolher: armazenados (sem compactação), Encolhidos, Reduzidos (métodos 1-4), Imploded, Tokenizing, Deflated, Deflate64, BZIP2 , LZMA (EFS), WavPack, PPMd, onde, teoricamente, poderia tentar todos eles e escolher o melhor resultado, mas geralmente basta ir com Deflated.

O UTF funciona da mesma maneira. Existem vários algoritmos de codificação, cada um com características diferentes, mas você normalmente escolhe UTF-8 porque ele é amplamente suportado em oposição às outras variantes UTF, que por sua vez é porque é compatível com bit-a-bit para ASCII de 7 bits, tornando fácil use na maioria das plataformas de computador modernas, que geralmente usam uma extensão de 8 bits do ASCII.

    
por 21.05.2011 / 01:54
fonte