Qual é a diferença entre texto ASCII e Unicode?

ASCII e Unicode são padrões que se referem à representação digital de texto, especificamente caracteres que constituem o texto. No entanto, os dois padrões são significativamente diferentes, com muitas propriedades refletindo sua respectiva ordem de criação.

América Versus the Universe

O American Standard Code for Information Interchange (ASCII), sem surpresa, atende a um público americano, escrevendo no alfabeto inglês. Ele lida com letras não acentuadas, como AZ e az, além de um pequeno número de símbolos de pontuação e caracteres de controle.

Em particular, não há como representar palavras emprestadas adotadas de outras línguas, como café em ASCII, sem anglicizá-las substituindo por caracteres acentuados (por exemplo, café ). Extensões ASCII localizadas foram desenvolvidas para atender às necessidades de vários idiomas, mas esses esforços tornaram a interoperabilidade difícil e estavam claramente ampliando as capacidades do ASCII.

Em contraste, o Conjunto de Caracteres Codificados Universal (Unicode) fica na extremidade oposta da escala de ambição. O Unicode tenta atender ao maior número possível de sistemas de escrita do mundo, na medida em que abrange línguas antigas e o conjunto favorito de símbolos expressivos de todos, o emoji.

Conjunto de caracteres ou codificação de caracteres?

Em termos simples, um conjunto de caracteres é uma seleção de caracteres (por exemplo, AZ), enquanto uma codificação de caracteres é um mapeamento entre um conjunto de caracteres e um valor que pode ser representado digitalmente (por exemplo, A = 1, B = 2).

O padrão ASCII é efetivamente ambos: ele define o conjunto de caracteres que representa e um método de mapeamento de cada caractere para um valor numérico.

Em contraste, a palavra Unicode é usada em vários contextos diferentes para significar coisas diferentes. Você pode pensar nele como um termo abrangente, como ASCII, para se referir a um conjunto de caracteres e várias codificações. Mas, como existem várias codificações, o termo Unicode é frequentemente usado para se referir ao conjunto geral de caracteres, em vez de como eles são mapeados.

Tamanho

Devido ao seu escopo, o Unicode representa muito mais caracteres do que ASCII. ASCII padrão usa um intervalo de 7 bits para codificar 128 caracteres distintos. O Unicode, por outro lado, é tão grande que precisamos usar terminologias diferentes apenas para falar sobre ele!

Unicode atende a 1.111.998 pontos de código endereçáveis . Um ponto de código é aproximadamente análogo a um espaço reservado para um personagem, mas a situação é muito mais complicada do que quando você começa a se aprofundar nos detalhes!

Uma comparação mais útil é quantos scripts (ou sistemas de escrita) são suportados atualmente. Obviamente, o ASCII lida apenas com o alfabeto inglês, essencialmente a escrita latina ou romana. A versão do Unicode produzida em 2020 vai muito além: inclui suporte para um total de 154 scripts.

Armazenamento

O intervalo de 7 bits do ASCII significa que cada caractere é armazenado em um único byte de 8 bits; o bit sobressalente não é usado no ASCII padrão. Isso torna os cálculos de tamanho triviais: o comprimento do texto, em caracteres, é o tamanho do arquivo em bytes.

Você pode confirmar isso com a seguinte sequência de comandos bash. Primeiro, criamos um arquivo contendo 12 letras de texto:

 $ echo -n 'Hello, world' > foo

Para verificar se o texto está na codificação ASCII, podemos usar o comando file :

 $ file foo
foo: ASCII text, with no line terminators

Finalmente, para obter o número exato de bytes que o arquivo ocupa, usamos o comando stat :

 $ stat -f%z foo
12

Como o padrão Unicode lida com uma gama muito maior de caracteres, um arquivo Unicode naturalmente ocupa mais espaço de armazenamento. Exatamente quanto depende da codificação.

Repetir o mesmo conjunto de comandos anterior, usando um caractere que não pode ser representado em ASCII, dá o seguinte:

 $ echo -n '€' > foo
$ file foo
foo: UTF-8 Unicode text, with no line terminators
$ stat -f%z foo
3

Esse único caractere ocupa 3 bytes em um arquivo Unicode. Observe que o bash criou automaticamente um arquivo UTF-8, pois um arquivo ASCII não pode armazenar o caractere escolhido (€). UTF-8 é de longe a codificação de caracteres mais comum para Unicode; UTF-16 e UTF-32 são duas codificações alternativas, mas são muito menos usadas.

UTF-8 é uma codificação de largura variável, o que significa que usa diferentes quantidades de armazenamento para diferentes pontos de código. Cada ponto de código ocupará entre um e quatro bytes, com a intenção de que mais caracteres comuns requeiram menos espaço, fornecendo um tipo de compactação embutida. A desvantagem é que determinar os requisitos de comprimento ou tamanho de um determinado trecho de texto se torna muito mais complicado.

ASCII é Unicode, mas Unicode não é ASCII

Para compatibilidade com versões anteriores, os primeiros 128 pontos de código Unicode representam os caracteres ASCII equivalentes. Como o UTF-8 codifica cada um desses caracteres com um único byte, qualquer texto ASCII também é um texto UTF-8. Unicode é um superconjunto de ASCII.

No entanto, conforme mostrado acima, muitos arquivos Unicode não podem ser usados ​​em um contexto ASCII. Qualquer caractere que esteja fora dos limites será exibido de uma maneira inesperada, geralmente com caracteres substituídos que são completamente diferentes daqueles que foram planejados.

Uso Moderno

Para a maioria dos propósitos, ASCII é amplamente considerado um padrão legado. Mesmo em situações que suportam apenas o script latino – onde o suporte total para as complexidades do Unicode é desnecessário, por exemplo – geralmente é mais conveniente usar UTF-8 e tirar vantagem de sua compatibilidade ASCII.

Em particular, as páginas da web devem ser salvas e transmitidas usando UTF-8, que é o padrão para HTML5. Isso contrasta com a web anterior, que lidava com ASCII por padrão antes de ser substituída pelo Latim 1.

Um padrão que está mudando

A última revisão do ASCII ocorreu em 1986.

Em contraste, o Unicode continua a ser atualizado anualmente. Novos scripts, personagens e, particularmente, novos emojis são adicionados regularmente. Com apenas uma pequena fração deles alocada, o conjunto completo de caracteres provavelmente crescerá e crescerá no futuro previsível.

Relacionado: Os 100 Emojis Mais Populares Explicados

ASCII Versus Unicode

ASCII serviu ao seu propósito por muitas décadas, mas o Unicode agora o substituiu efetivamente para todos os propósitos práticos, exceto os sistemas legados. O Unicode é maior e, portanto, mais expressivo. Representa um esforço colaborativo mundial e oferece uma flexibilidade muito maior, embora às custas de alguma complexidade.