Por que os caracteres ingleses precisam de menos bytes para representá-los do que os caracteres de outros alfabetos?
Enquanto a maioria de nós provavelmente nunca parou para pensar sobre isso, os caracteres alfabéticos não são todos do mesmo tamanho no número de bytes necessários para representá-los. Mas por que isso? A postagem de perguntas e respostas do SuperUser de hoje tem as respostas para a pergunta de um curioso leitor.
A sessão de perguntas e respostas de hoje nos é oferecida por cortesia do SuperUser - uma subdivisão do Stack Exchange, um agrupamento de sites de perguntas e respostas conduzido pela comunidade..
Imagem parcial do gráfico ASCII, cortesia da Wikipedia.
A questão
O leitor de superusuário khajvah quer saber por que diferentes alfabetos ocupam diferentes quantidades de espaço em disco quando salvos:
Quando eu coloco 'a' em um arquivo de texto e o salvo, ele tem 2 bytes de tamanho. Mas quando eu coloco um caractere como 'ա' (uma letra do alfabeto armênio), ele faz com que ele tenha 3 bytes de tamanho.
Qual é a diferença entre alfabetos em um computador? Por que o inglês ocupa menos espaço quando salvo??
Cartas são letras, certo? Talvez não! Qual é a resposta para este mistério alfabético?
A resposta
Os contribuidores do SuperUser, Doktoro Reichard e ernie, têm a resposta para nós. Primeiro, Doktoro Reichard:
Um dos primeiros esquemas de codificação a serem desenvolvidos para uso em computadores convencionais é o ASCII (Código Padrão Americano para Intercâmbio de Informações) padrão. Foi desenvolvido na década de 1960 nos Estados Unidos.
O alfabeto inglês usa parte do alfabeto latino (por exemplo, há poucas palavras acentuadas em inglês). Existem 26 letras individuais nesse alfabeto, não considerando o caso. E também teria que existir os números individuais e sinais de pontuação em qualquer esquema que pretenda codificar o alfabeto inglês.
A década de 1960 foi também uma época em que os computadores não tinham a quantidade de memória ou espaço em disco que temos agora. O ASCII foi desenvolvido para ser uma representação padrão de um alfabeto funcional em todos os computadores americanos. Na época, a decisão de fazer com que cada caractere ASCII de 8 bits (1 byte) fosse tomada devido a detalhes técnicos da época (o artigo da Wikipedia menciona o fato de que a fita perfurada continha 8 bits em uma posição por vez). De fato, o esquema ASCII original pode ser transmitido usando 7 bits, e o oitavo pode ser usado para verificações de paridade. Desenvolvimentos posteriores expandiram o esquema ASCII original para incluir vários caracteres acentuados, matemáticos e terminais.
Com o recente aumento do uso de computadores em todo o mundo, mais e mais pessoas de diferentes idiomas tiveram acesso a um computador. Isso significava que, para cada idioma, novos esquemas de codificação tinham que ser desenvolvidos, independentemente de outros esquemas, que entrariam em conflito se fossem lidos de diferentes terminais de linguagem..
O Unicode surgiu como uma solução para a existência de diferentes terminais, mesclando todos os possíveis caracteres significativos em um único conjunto de caracteres abstratos..
O UTF-8 é uma maneira de codificar o conjunto de caracteres Unicode. É uma codificação de largura variável (ou seja, caracteres diferentes podem ter tamanhos diferentes) e foi projetada para compatibilidade com versões anteriores do antigo esquema ASCII. Como tal, o conjunto de caracteres ASCII permanecerá com um byte de tamanho, enquanto que quaisquer outros caracteres terão dois ou mais bytes de tamanho. O UTF-16 é outra maneira de codificar o conjunto de caracteres Unicode. Em comparação com o UTF-8, os caracteres são codificados como um conjunto de uma ou duas unidades de código de 16 bits.
Como afirmado em outros comentários, o caractere 'a' ocupa um único byte, enquanto 'ա' ocupa dois bytes, denotando uma codificação UTF-8. O byte extra na questão original foi devido à existência de um caractere de nova linha no final.
Seguido pela resposta de ernie:
1 byte é 8 bits e pode, assim, representar até 256 (2 ^ 8) valores diferentes.
Para linguagens que exigem mais possibilidades do que isso, um simples mapeamento de 1 para 1 não pode ser mantido, portanto, mais dados são necessários para armazenar um caractere.
Note que, geralmente, a maioria das codificações usa os primeiros 7 bits (128 valores) para caracteres ASCII. Isso deixa o oitavo bit, ou mais 128 valores para mais caracteres. Adicione caracteres acentuados, idiomas asiáticos, cirílico etc., e você pode ver facilmente por que um byte não é suficiente para manter todos os caracteres.
Tem algo a acrescentar à explicação? Som desligado nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui.