Por que os caracteres ingleses requerem menos bytes para representar do que outros alfabetos?

30

Quando eu coloco 'a' em um arquivo de texto, ele faz 2 bytes, mas quando eu coloco, digamos 'ա', que é uma letra do alfabeto armênio, isso faz com que ele seja 3 bytes.

Qual é a diferença entre alfabetos para um computador?
Por que o inglês ocupa menos espaço?

    
por khajvah 11.04.2014 / 20:07

7 respostas

41

Um dos primeiros esquemas de codificação a serem desenvolvidos para uso em computadores convencionais é o ASCII ( American Standard Código para Intercâmbio de Informações ). Foi desenvolvido nos anos 60 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 os 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 tivesse 8 bits (1 byte) era 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, os oito podem ser usados 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 precisavam ser desenvolvidos, independentemente de outros esquemas, que entrariam em conflito se fossem lidos de diferentes terminais de linguagem.

Unicode veio como uma solução para a existência de diferentes terminais, mesclando todos os possíveis caracteres significativos em um único caractere abstrato conjunto.

UTF-8 é uma maneira de codificar o conjunto de caracteres Unicode. É uma codificação de largura variável (por exemplo, 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á como um byte grande enquanto que quaisquer outros caracteres terão dois ou mais bytes. 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 nos comentários, o caractere 'a' ocupa um único byte, enquanto 'ա' ocupa dois bytes, denotando uma codificação UTF-8. O byte extra em sua pergunta foi devido à existência de um caractere de nova linha no final (sobre o qual o OP descobriu).

    
por 11.04.2014 / 20:52
17

1 byte é de 8 bits e pode, assim, representar até 256 (2 ^ 8) valores diferentes.

Para idiomas que exigem mais possibilidades do que isso, um mapeamento simples 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 os caracteres ASCII . Isso deixa o oitavo bit, ou mais 128 valores para mais caracteres. . . adicionar caracteres acentuados, idiomas asiáticos, cirílico, etc, e você pode ver facilmente porque 1 byte não é suficiente para manter todos os caracteres.

    
por 11.04.2014 / 20:37
10

Em UTF-8, caracteres ASCII usam um byte, outros caracteres usam dois, três ou quatro bytes. / p>     

por 11.04.2014 / 20:10
3

A quantidade de bytes necessários para um caractere (sobre o qual a pergunta é aparentemente) depende da codificação do caractere. Se você usar a codificação ArmSCII, cada letra armênia ocupa apenas um byte. Não é uma boa escolha hoje em dia.

Na codificação de transferência UTF-8 para Unicode, os caracteres precisam de um número diferente de bytes. Nele, “a” leva apenas um byte (a idéia sobre dois bytes é um tipo de confusão), “á” leva dois bytes, e a letra armênia ayb “ա” também leva dois bytes. Três bytes devem ser algum tipo de confusão. Em contraste, e. Letra bengali um "অ" leva três bytes em UTF-8.

O pano de fundo é simplesmente que o UTF-8 foi projetado para ser muito eficiente para caracteres ASCII, bastante eficiente para sistemas de escrita na Europa e arredores, e todo o resto é menos eficiente. Isso significa que as letras latinas básicas (que consistem basicamente do texto em inglês), somente um byte é necessário para um caractere; para grego, cirílico, armênio e alguns outros, dois bytes são necessários; todo o resto precisa de mais.

O UTF-8 tem (como apontado em um comentário) também a propriedade útil que os dados Ascii (quando representados como unidades de 8 bits, que tem sido quase o único caminho por um longo tempo) é trivialmente codificado em UTF-8, também.

    
por 11.04.2014 / 21:22
3

Códigos de caracteres na década de 1960 (e muito além disso) eram específicos da máquina. Na década de 1980, usei brevemente uma máquina DEC 2020, que tinha palavras de 36 bits, e 5, 6 e 8 ( IIRC ) bits por codificação de caracteres. Antes disso, usei uma série IBM 370 com EBCDIC. O ASCII com 7 bits trouxe a ordem, mas ficou uma bagunça com os "codepages" do IBM PC usando todos os 8 bits para representar caracteres extras, como todos os tipos de desenho de caixa para pintar menus primitivos e extensões ASCII posteriores como Latin-1 codificações, com os primeiros 7 bits como ASCII e a outra metade para "caracteres nacionais" como ñ , Ç , ou outros. Provavelmente o mais popular foi Latin-1, adaptado para Inglês e idiomas mais europeus usando caracteres latinos ( e acentos e variantes).

Escrever mistura de texto, por ex. Inglês e espanhol correram bem (basta usar Latin-1, superconjunto de ambos), mas misturar qualquer coisa que usasse codificações diferentes (digamos, um trecho de grego ou russo, sem mencionar uma língua asiática como o japonês) era um verdadeiro pesadelo. O pior era que o russo e particularmente o japonês e o chinês tinham várias codificações populares, completamente incompatíveis.

Hoje usamos o Unicode, que é acoplado a codificações eficientes como UTF-8, que favorecem caracteres ingleses (surpreendentemente, a codificação de letras inglesas corresponde a ASCII), fazendo com que muitos caracteres não ingleses usem codificações mais longas. / p>     

por 14.04.2014 / 04:03
2

Windows 8.1 EUA / Inglês Arquivo com um único 'a' salvo com o bloco de notas.

  • Salvar como ANSI 1 byte
  • Salvar como Unicode 4 bytes
  • Salvar como UTF-8 4 bytes

Arquivo com um único 'ա' salvo com o bloco de notas

  • Salvar como ANSI não é possível
  • Salvar como Unicode 4 bytes
  • Salvar como UTF-8 5 bytes

Um único 'a' é codificado como um único byte em ANSI; em Unicode, cada caractere é geralmente de 2 bytes; há também uma BOM de 2 bytes (Byte Order Marker) no início do arquivo. O UTF-8 tem uma BOM de 3 bytes e o caractere de byte único.

Para o 'ա' esse caractere não existe no conjunto de caracteres ANSI e não pode ser salvo na minha máquina. O arquivo Unicode é o mesmo de antes e o arquivo UTF-8 tem 1 byte maior, pois o caractere ocupa 2 bytes.

Se a sua máquina for de uma região diferente, você poderá ter uma página de códigos OEM diferente instalada, a qual possui diferentes glifos para os 255 caracteres possíveis na faixa ASCII. Como @ntoskrnl mencionou a página de códigos do OEM para a minha máquina seria o Windows-1252, que é o padrão para o inglês dos EUA.

    
por 11.04.2014 / 22:00
2

Se você estiver interessado em saber como os personagens são armazenados, você pode ir para www.unicode.org e dar uma olhada. No topo da página principal, há um link "Cartas de código" que mostra todos os códigos de caracteres disponíveis no Unicode.

Em suma, há pouco mais de um milhão de códigos disponíveis no Unicode (nem todos são usados). Um byte pode conter 256 valores diferentes, portanto você precisaria de três bytes se quisesse armazenar todos os códigos Unicode possíveis.

Em vez disso, o Unicode geralmente é armazenado na codificação "UTF-8", que usa menos bytes para alguns caracteres e mais para outros. Os primeiros 128 valores de código são armazenados em um único byte, até os primeiros 2048 valores de código são armazenados em dois bytes, até 65536 são armazenados em três bytes e o restante leva quatro bytes. Isso foi organizado para que os valores de código usados com mais frequência ocupem menos espaço. AZ, az, 0-9 e! @ $% ^ & * () - [} {}; ': "|,. / < & gt ;? e alguns que eu esqueci tomar um byte; quase todo o inglês, 98% de alemão e francês (apenas suposição) podem ser armazenados em um byte por caractere, e esses são os caracteres mais usados: cirílico, grego, hebraico, árabe e outros usam dois bytes por caractere. Chinês, japonês, coreano, tailandês, toneladas de símbolos matemáticos, podem ser escritos em três bytes por caractere.Rare coisas (se você quiser escrever texto em Linear A ou Linear B, Emojis) tomar quatro bytes.

Outra codificação é UTF-16. Tudo o que leva 1, 2 ou 3 bytes em UTF-8 leva dois bytes em UTF-16. Isso é uma vantagem se você tiver texto em chinês ou japonês com muito poucos caracteres latinos no meio.

Sobre as razões para o design do UTF-8: Ele tem várias vantagens sobre outros designs. Eles são:

Compatibilidade com caracteres US-ASCII

Compacidade razoável

Auto-sincronização: Isso significa que se você receber uma parte de uma seqüência de bytes que são caracteres na codificação UTF-8, você pode descobrir onde o caractere é iniciado. Em algumas codificações, tanto xy quanto yx podem ser codificações válidas de caracteres, então se você receber uma parte de uma sequência ... xyxyxyxyxyxy ... você não pode saber quais caracteres você possui.

Classificação de classificação: Se você classificar cadeias contendo caracteres codificados em UTF-8 por seus valores de bytes, elas serão classificadas automaticamente de acordo com seus valores Unicode.

Compatível com código de byte único: A maior parte do código que assume valores de byte único funciona automaticamente corretamente com caracteres codificados em UTF-8.

Mais quaisquer razões que eu esqueci.

    
por 13.04.2014 / 14:09