# Codificação de largura variável

Uma codificação de largura variável é um tipo de esquema 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 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 é um nome incorreto, porque o tamanho da representação é um atributo da codificação, não do conjunto de caracteres).
Codificações iniciais 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 aventuras pros primeiros microcomputadores. No entanto, os discos (que, ao contrário das fitas, permitem acesso aleatório, permitindo que o texto seja carregado sob demanda), os aumentos na memória do computador e os algoritmos de compressão de uso geral tornaram esses truques amplamente obsoletos.
Codificações multibyte são geralmente o resultado de uma necessidade de aumentar o número de caracteres que podem ser codificados sem quebrar a compatibilidade com versões anteriores com uma restrição existente. Por exemplo, com um byte (de 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 preexistentes, 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 iniciais (que vêm primeiro em uma sequência de várias unidades) e unidades de trilhas, (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 string de quatro caracteres "I ♥ NY" é codificada em UTF-8 assim (mostrado como valores de bytes em hexadecimal): 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 inicial e 99 e A5 são unidades de trilhas. O símbolo do coração é representado pela combinação da unidade inicial e as duas unidades de trilhas.
O UTF-8 torna 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 iniciais ou de trilhas, 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). As codificações ISO-2022-JP, ISO-2022-CN e ISO-2022-KR usaram o intervalo (hexadecimal) 21-7E para unidades iniciais e de trilhas e as separou dos singletons usando sequências de escape ISO 2022 para alternar entre os modos 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 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 (hexadecimal) 80-FF enquanto os singletons estavam apenas na faixa de 00-7F. As unidades iniciais e de trilhas estavam no intervalo A1-FE, (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 os seus delimitadores fossem caracteres ASCII e você evitasse truncar strings em comprimentos fixos, mas uma quebra no meio de um caractere multibyte ainda poderia causar grande corrompimento.
Nas plataformas PC (DOS e Microsoft Windows), duas codificações foram estabelecidas para japonês e chinês tradicional em que todos os singletons, unidades iniciais e de trilhas se sobrepuseram: Shift-JIS e Big5 respectivamente. No Shift-JIS, as unidades iniciais tinham os intervalos 81-9F e E0-FC, as de trilhas tinham os intervalos 40-7E e 80-FC e os singletons tinham os intervalos 21-7E e A1-DF. Em Big5, as unidades principais tinham o intervalo A1-FE, as de trilhas tinham os intervalos 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 (estranhamente a barra invertida não tinha).

## Codificações Unicode de largura variável

O padrão unicode tem duas codificações de largura variável: UTF-8 e UTF-16 (ele também tem uma codificação de largura fixa, UTF-32). Originalmente, os padrões unicode e ISO 10646 deveriam ter largura fixa, com a do unicode sendo 16 bits e a do ISO 10646 sendo 32 bits. O ISO 10646 forneceu uma codificação de largura variável chamada UTF-1, na qual singletons estavam no intervalo 00-9F, unidades iniciais no A0-FF e unidades de trilha nos intervalos A0-FF e 21-7E. Por causa desse design ruim, paralelo ao Shift-JIS e ao Big5 em sua sobreposição de valores, os inventores do sistema operacional Plano 9, o primeiro a implementar o unicode, o abandonou e o substituiu por uma codificação de largura variável muito melhor projetada para o unicode: O UTF-8, em que os singletons têm o intervalo 00-7F, as unidades iniciais têm o intervalo C0-FD (atualmente C2-F4, para evitar sequências muito longas e para manter o sincronismo com a capacidade de codificação de UTF-16 (consulte o artigo UTF-8)) e as de trilhas têm o intervalo 80-BF.
A unidade inicial também informa quantas unidades de trilhas 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 os intervalos 0000-D7FF (55.296 pontos de código) e E000-FFFF (8192 pontos de código) (63.488 no total), unidades iniciais no intervalo D800-DBFF (1024 pontos de código) e unidades de trilhas no intervalo DC00– DFFF (1024 pontos de código, 2048 no total). As unidades inicais e de trilhas (respectivamente chamadas na terminologia unicode de substitutos altos e baixos) mapeiam 1.024×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 (substitutos não são codificáveis).