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.
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.