Codificação de largura variável - Variable-width encoding

Uma codificação de largura variável é um tipo de esquema de codificação de caracteres em que códigos de comprimentos diferentes são usados ​​para codificar um conjunto de caracteres (um repertório de símbolos) para representação, geralmente em um computador . As codificações de largura variável mais comuns são as codificações multibyte , que usam vários números de bytes ( octetos ) para codificar diferentes caracteres. (Alguns autores, principalmente na documentação da Microsoft, usam o termo conjunto de caracteres multibyte, que é uma designação incorreta , porque o tamanho da representação é um atributo da codificação, não do conjunto de caracteres.)

As primeiras codificações de largura variável, usando menos de um byte por caractere, às vezes eram usadas para compactar texto em inglês em menos bytes em jogos de aventura para os primeiros microcomputadores . No entanto, os discos (que ao contrário das fitas permitiam acesso aleatório, permitindo que o texto fosse carregado sob demanda), os aumentos na memória do computador e os algoritmos de compactação de uso geral tornaram esses truques amplamente obsoletos.

Codificações multibyte geralmente são o resultado de uma necessidade de aumentar o número de caracteres que podem ser codificados sem quebrar a compatibilidade com versões anteriores de uma restrição existente. Por exemplo, com um byte (8 bits) por caractere, pode-se codificar 256 caracteres possíveis; para codificar mais de 256 caracteres, a escolha óbvia seria usar dois ou mais bytes por unidade de codificação, dois bytes (16 bits) permitiriam 65.536 caracteres possíveis, mas tal mudança quebraria a compatibilidade com os sistemas existentes e, portanto, pode não ser viável em tudo.

Estrutura geral

Uma vez que o objetivo de um sistema de codificação multibyte é minimizar as alterações no software aplicativo existente, alguns caracteres devem reter seus códigos de unidade única pré-existentes, mesmo enquanto outros caracteres têm unidades múltiplas em seus códigos. O resultado é que existem três tipos de unidades em uma codificação de largura variável: singletons , que consistem em uma única unidade, unidades principais , que vêm primeiro em uma sequência de várias unidades , e unidades de rastreamento , que vêm depois em uma sequência de várias unidades. O software de entrada e exibição obviamente precisa saber sobre a estrutura do esquema de codificação multibyte, mas outro software geralmente não precisa saber se um par de bytes representa dois caracteres separados ou apenas um caractere.

Por exemplo, a sequência de quatro caracteres " I ♥ NY " é codificada em UTF-8 assim (mostrado como valores de bytes hexadecimais ): 49 E2 99 A5 4E 59 . Das seis unidades nessa sequência, 49 , 4E e 59 são singletons (para I, N e Y ), E2 é uma unidade principal e 99 e A5 são unidades rastreadoras. O símbolo do coração é representado pela combinação da unidade dianteira e as duas unidades posteriores.

O UTF-8 torna mais fácil para um programa identificar os três tipos de unidades, uma vez que eles caem em intervalos de valores separados. Codificações mais antigas de largura variável normalmente não são bem projetadas, pois os intervalos podem se sobrepor. Um aplicativo de processamento de texto que lida com a codificação de largura variável deve então escanear o texto desde o início de todas as sequências definitivas para identificar as várias unidades e interpretar o texto corretamente. Em tais codificações, pode-se encontrar falsos positivos ao procurar uma string no meio do texto. Por exemplo, se os valores hexadecimais DE, DF, E0 e E1 podem ser unidades principais ou unidades de rastreamento, uma pesquisa pela sequência de duas unidades DF E0 pode gerar um falso positivo na sequência DE DF E0 E1, que consiste em duas sequências consecutivas de duas unidades. Também existe o perigo de que uma única unidade corrompida ou perdida possa tornar incorreta toda a interpretação de uma grande série de sequências de várias unidades. Em uma codificação de largura variável onde todos os três tipos de unidades são disjuntos, a pesquisa de string sempre funciona sem falsos positivos e (desde que o decodificador seja bem escrito) a corrupção ou perda de uma unidade corrompe apenas um caractere.

Codificações multibyte CJK

O primeiro uso de codificações multibyte foi para a codificação de chinês, japonês e coreano, que têm grandes conjuntos de caracteres com mais de 256 caracteres. No início, a codificação foi restringida ao limite de 7 bits. As codificações ISO-2022-JP, ISO-2022-CN e ISO-2022-KR usaram o intervalo 21-7E (hexadecimal) para unidades principais e unidades de trilha e as separaram dos singletons usando sequências de escape ISO 2022 para alternar entre o modo de byte único e multibyte. Um total de 8.836 (94 × 94) caracteres podem ser codificados no início, e outros conjuntos de 94 × 94 caracteres com comutação. Os esquemas de codificação ISO 2022 para CJK ainda estão em uso na Internet. A natureza com estado dessas codificações e a grande sobreposição as tornam muito difíceis de processar.

Em plataformas Unix , as codificações ISO 2022 de 7 bits foram substituídas por um conjunto de esquemas de codificação de 8 bits, o Código Unix Estendido: EUC-JP, EUC-CN e EUC-KR. Em vez de distinguir entre as sequências de várias unidades e os singletons com sequências de escape, o que tornava as codificações com estado, as sequências de várias unidades foram marcadas por ter o conjunto de bits mais significativo, ou seja, estar na faixa de 80 – FF (hexadecimal), enquanto os singletons eram apenas na faixa de 00–7F. As unidades principais e as unidades finais estavam no intervalo A1 a FE (hexadecimal), ou seja, o mesmo que seu intervalo nas codificações ISO 2022, mas com o bit alto definido como 1. Essas codificações eram razoavelmente fáceis de trabalhar, desde que todos seus delimitadores eram caracteres ASCII e você evitou truncar strings para comprimentos fixos, mas uma quebra no meio de um caractere multibyte ainda pode causar grande corrupção.

No PC ( plataformas DOS e Microsoft Windows ), duas codificações foram estabelecidas para japonês e chinês tradicional em que todos os singletons, unidades principais e unidades de trilha se sobrepuseram: Shift-JIS e Big5, respectivamente. No Shift-JIS, as unidades principais tinham o intervalo 81-9F e E0-FC, as unidades de trilha tinham o intervalo 40-7E e 80-FC e os singletons tinham o intervalo 21-7E e A1-DF. Em Big5, as unidades principais tinham o intervalo A1 – FE, as unidades de trilha tinham o intervalo 40–7E e A1 – FE e os singletons tinham o intervalo 21–7E (todos os valores em hexadecimal). Essa sobreposição novamente tornou o processamento complicado, embora pelo menos a maioria dos símbolos tivesse valores de byte exclusivos (embora estranhamente a barra invertida não tivesse).

Codificações Unicode de largura variável

O padrão Unicode tem duas codificações de largura variável: UTF-8 e UTF-16 (também possui uma codificação de largura fixa, UTF-32 ). Originalmente, os padrões Unicode e ISO 10646 deveriam ter largura fixa, com Unicode sendo 16 bits e ISO 10646 sendo 32 bits. ISO 10646 forneceu uma codificação de largura variável chamada UTF-1 , na qual singletons tinham o intervalo 00–9F, unidades iniciais no intervalo A0 – FF e unidades de rastreamento nos intervalos A0 – FF e 21–7E. Por causa desse design ruim, semelhante a Shift JIS e Big5 em sua sobreposição de valores, os inventores do sistema operacional Plan 9 , o primeiro a implementar Unicode por completo, o abandonaram e substituíram por uma codificação de largura variável muito melhor projetada para Unicode : UTF-8, em que os singletons têm o intervalo 00-7F, as unidades principais têm o intervalo C0-FD (agora, na verdade, C2-F4, para evitar sequências muito longas e manter o sincronismo com a capacidade de codificação de UTF-16; consulte o UTF -8 artigo), e as unidades de trilha têm o intervalo 80 – BF. A unidade principal também informa quantas unidades de rastreamento seguem: uma após C2 – DF, duas após E0 – EF e três após F0 – F4.

O UTF-16 foi desenvolvido para se libertar do limite de 65.536 caracteres do Unicode original (1.x) sem quebrar a compatibilidade com a codificação de 16 bits. Em UTF-16, os singletons têm o intervalo 0000 – D7FF (55.296 pontos de código) e E000 – FFFF (8192 pontos de código, 63.488 no total), unidades principais no intervalo D800 – DBFF (1024 pontos de código) e unidades de rastreamento no intervalo DC00– DFFF (1024 pontos de código, 2048 no total). As unidades de liderança e trilha, chamadas de substitutos altos e substitutos baixos , respectivamente, na terminologia Unicode, mapeiam 1024 × 1024 ou 1.048.576 caracteres suplementares, tornando 1.112.064 (63.488 pontos de código BMP + 1.048.576 pontos de código representados por pares substitutos altos e baixos) pontos de código codificáveis , ou valores escalares na linguagem Unicode (substitutos não são codificáveis).

Veja também

Notas

Referências