Qual é a diferença entre ASCII e Unicode?

407

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

ASCII possui um total de 128 caracteres (256 no conjunto estendido).

Existe alguma especificação de tamanho para caracteres Unicode?

Ashvitha
fonte

Respostas:

534

ASCII define 128 caracteres, que são mapeados para os números de 0 a 127. O Unicode define (menos que) 2 21 caracteres, que, da mesma forma, são mapeados para os números de 0 a 21 21 (embora nem todos os números estejam atribuídos no momento e alguns sejam reservados).

Unicode é um superconjunto de ASCII e os números de 0 a 127 têm o mesmo significado em ASCII que em Unicode. Por exemplo, o número 65 significa "capital latino 'A'".

Como os caracteres Unicode geralmente não se encaixam em um byte de 8 bits, existem várias maneiras de armazenar caracteres Unicode em seqüências de bytes, como UTF-32 e UTF-8.

Kerrek SB
fonte
4
@riderBill: E agora? De quais 3 bits você está falando? Não há bits no Unicode. Apenas codepoints.
Kerrek SB 22/02
@riderBill: novamente: de quais "3 bytes" você está falando agora? :-) (Nada disto tem a ver com Unicode Unicode é apenas cerca de atribuir significado aos números, não é sobre bits e bytes..)
Kerrek SB
8
@riderBill: Unicode " não usa entre 1 e 4 bytes". Unicode é uma atribuição de significado a números. Ele não usa bytes. Existem certos esquemas de codificação padronizados para representar pontos de código Unicode como um fluxo de bytes, mas eles são ortogonais ao Unicode como um conjunto de caracteres. (Sim, sinta-se livre para apagar o que quiser.)
Kerrek SB
@CleanCrispCode Unicode é na verdade um superconjunto da ISO-8859-1 , que é em si um superconjunto do ASCII. Às vezes é útil saber.
Mark Ransom
8
Para esclarecer, Unicode conjunto de caracteres em si é um super conjunto de ISO-8859-1 conjunto de caracteres , mas UTF-8 codificação é não um super conjunto de ISO-8859-1 codificação , mas ASCII codificação .
minmaxavg
393

Entender por que o ASCII e o Unicode foram criados em primeiro lugar me ajudou a entender as diferenças entre os dois.

ASCII, Origens

Conforme indicado nas outras respostas, o ASCII usa 7 bits para representar um caractere. Usando 7 bits, podemos ter no máximo 2 ^ 7 (= 128) combinações distintas * . O que significa que podemos representar no máximo 128 caracteres.

Espere, 7 bits? Mas por que não 1 byte (8 bits)?

O último bit (8º) é usado para evitar erros como bit de paridade . Isso foi relevante anos atrás.

A maioria dos caracteres ASCII são caracteres imprimíveis do alfabeto, como abc, ABC, 123,? & !, etc. Os outros são caracteres de controle , como retorno de carro, avanço de linha , tabulação etc.

Veja abaixo a representação binária de alguns caracteres em ASCII:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

Veja a tabela ASCII completa aqui .

ASCII foi feito apenas para inglês.

O que? Por que apenas inglês? Tantas línguas por aí!

Porque o centro da indústria de computadores estava nos EUA naquela época. Como conseqüência, eles não precisavam suportar acentos ou outras marcas como á, ü, ç, ñ etc. (também conhecidos como diacríticos ).

ASCII estendido

Algumas pessoas inteligentes começaram a usar o 8º bit (o bit usado para paridade) para codificar mais caracteres para suportar seu idioma (para suportar "é", em francês, por exemplo). Apenas o uso de um bit extra dobrou o tamanho da tabela ASCII original para mapear até 256 caracteres (2 ^ 8 = 256 caracteres). E não 2 ^ 7 como antes (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

O nome para esse "ASCII estendido para 8 bits e não 7 bits como antes" poderia ser apenas referido como "ASCII estendido" ou "ASCII de 8 bits".

Como @Tom apontou em seu comentário abaixo, não existe " ASCII estendido ", mas essa é uma maneira fácil de se referir a esse truque de 8 bits. Existem muitas variações da tabela ASCII de 8 bits, por exemplo, a ISO 8859-1, também chamada ISO Latin-1 .

Unicode, a ascensão

O ASCII Extended resolve o problema de idiomas baseados no alfabeto latino ... e os outros que precisam de um alfabeto completamente diferente? Grego? Russo? Chinês e os gostos?

Nós precisaríamos de um conjunto de caracteres totalmente novo ... esse é o racional por trás do Unicode. O Unicode não contém todos os caracteres de todos os idiomas, mas com certeza contém uma quantidade gigantesca de caracteres ( consulte esta tabela ).

Você não pode salvar texto no disco rígido como "Unicode". Unicode é uma representação abstrata do texto. Você precisa "codificar" essa representação abstrata. É aí que uma codificação entra em jogo.

Codificações: UTF-8 vs UTF-16 vs UTF-32

Esta resposta faz um bom trabalho ao explicar o básico:

  • UTF-8 e UTF-16 são codificações de comprimento variável.
  • No UTF-8, um caractere pode ocupar um mínimo de 8 bits.
  • No UTF-16, o comprimento de um caractere começa com 16 bits.
  • UTF-32 é uma codificação de comprimento fixo de 32 bits.

UTF-8 usa o conjunto ASCII para os primeiros 128 caracteres. Isso é útil porque significa que o texto ASCII também é válido no UTF-8.

Mnemônicos:

  • UTF- 8 : mínimo de 8 bits.
  • UTF- 16 : mínimo de 16 bits.
  • UTF- 32 : mínimo e máximo de 32 bits.

Nota:

Por que 2 ^ 7?

Isso é óbvio para alguns, mas apenas por precaução. Temos sete slots disponíveis preenchidos com 0 ou 1 ( código binário ). Cada um pode ter duas combinações. Se temos sete pontos, temos 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 combinações. Pense nisso como uma trava combinada com sete rodas, cada roda tendo apenas dois números.

Fonte: Wikipedia , este ótimo post e Mocki, onde eu inicialmente postei este resumo.

Andrew
fonte
7
Não há texto, mas texto codificado. Algumas codificações são muito diretas, principalmente para conjuntos de caracteres com <= 256 pontos de código. "ASCII estendido" é um termo muito ambíguo; existem alguns que suportam grego, russo e / ou polonês. ASCII é insuficiente para o texto em inglês, que usa á, ü, ç, ñ. Suspeito que ele foi projetado para suportar linguagens de computador e não linguagens humanas. Dogmaticamente, ao escrever um arquivo ou fluxo, você tem um conjunto de caracteres e escolhe uma codificação. Seu leitor precisa obter os bytes e o conhecimento de qual codificação. Caso contrário, a comunicação falhou.
precisa
Muito obrigado pelo adendo. Eu atualizei a resposta de acordo.
30816 Andrew
Obrigado. Percebo que em todos os lugares as tabelas ASCII mostram códigos de caracteres como 0-127, mas as tabelas UTF-8 mostram os códigos como hexadecimais e não inteiros. Existe uma razão para isso? Por que as tabelas UTF-X não mostram 0-127 / 255/65535 versus 00-AF? Isso significa alguma coisa?
wayofthefuture
Obrigado pela resposta. Pergunta rápida: 'No UTF-16, o tamanho de um caractere começa com 16 bits' - Isso significa que os caracteres alfanuméricos não podem ser representados pelo UTF-16, pois são apenas caracteres de 8 bits?
Moondra
Ótima resposta, só que eu tenho um problema - o polonês realmente usa um alfabeto diferente? Eu pensei que nós usamos o mesmo que o inglês, apenas com algumas letras adicionais?
Nicofisi 4/11
89

O ASCII possui 128 pontos de código, de 0 a 127. Pode caber em um único byte de 8 bits; os valores de 128 a 255 tendem a ser usados ​​para outros caracteres. Com opções incompatíveis, causando o desastre da página de códigos . O texto codificado em uma página de códigos não pode ser lido corretamente por um programa que assume ou adivinhado em outra página de códigos.

O Unicode surgiu para solucionar esse desastre. A versão 1 começou com 65536 pontos de código, geralmente codificados em 16 bits. Posteriormente, estendeu a versão 2 para 1,1 milhão de pontos de código. A versão atual é 6.3, usando 110.187 dos 1,1 milhões de pontos de código disponíveis. Isso não cabe mais em 16 bits.

A codificação em 16 bits era comum quando a v2 apareceu, usada pelos sistemas operacionais Microsoft e Apple, por exemplo. E tempos de execução da linguagem como Java. A especificação da v2 criou uma maneira de mapear esses 1,1 milhão de pontos de código em 16 bits. Uma codificação chamada UTF-16, uma codificação de comprimento variável em que um ponto de código pode levar 2 ou 4 bytes. Os pontos de código v1 originais têm 2 bytes, os pontos adicionados, 4.

Outra codificação de tamanho variável muito comum, usada nos sistemas operacionais e nas ferramentas * nix é o UTF-8, um ponto de código pode demorar entre 1 e 4 bytes, os códigos ASCII originais levam 1 byte e os demais demoram mais. A única codificação de comprimento não variável é UTF-32, leva 4 bytes para um ponto de código. Não é usado com frequência, pois é um grande desperdício. Existem outros, como UTF-1 e UTF-7, amplamente ignorados.

Um problema com as codificações UTF-16/32 é que a ordem dos bytes dependerá da persistência da máquina que criou o fluxo de texto. Portanto, adicione à mistura UTF-16BE, UTF-16LE, UTF-32BE e UTF-32LE.

Ter essas diferentes opções de codificação traz de volta o desastre da página de códigos em algum grau, juntamente com debates acalorados entre os programadores sobre qual a melhor opção para a UTF. Sua associação com os padrões do sistema operacional praticamente desenha as linhas. Uma contra-medida é a definição de uma lista técnica, a marca de ordem de bytes, um ponto de código especial (U + FEFF, espaço de largura zero) no início de um fluxo de texto que indica como o restante do fluxo é codificado. Ele indica a codificação UTF e a endianess e é neutro para um mecanismo de renderização de texto. Infelizmente, é opcional e muitos programadores reivindicam o direito de omitê-lo, de modo que os acidentes ainda são bastante comuns.

Hans Passant
fonte
31

java fornece suporte para Unicode, isto é, suporta todos os alfabetos do mundo inteiro. Portanto, o tamanho do caractere em java é 2 bytes. E o intervalo é de 0 a 65535.

insira a descrição da imagem aqui

Siddarth Kanted
fonte
Keypicture to explicar..Nice
Ponmari Subramanian
2
Pena que está errado. "Códigos ASCII (128)" estaria correto.
63019 Mark Tolonen
15

O ASCII possui 128 posições de código, alocadas a caracteres gráficos e caracteres de controle (códigos de controle).

O Unicode possui 1.114.112 posições de código. Atualmente, cerca de 100.000 deles foram alocados a caracteres, e muitos pontos de código tornaram-se permanentemente não-caracteres (ou seja, nunca foram usados ​​para codificar nenhum caractere), e a maioria dos pontos de código ainda não foi atribuída.

As únicas coisas que ASCII e Unicode têm em comum são: 1) São códigos de caracteres. 2) As 128 primeiras posições de código do Unicode foram definidas com os mesmos significados que em ASCII, exceto que as posições de código dos caracteres de controle ASCII são definidas apenas como caracteres de controle denotativos, com nomes correspondentes a seus nomes ASCII, mas seus significados são não definido em Unicode.

Às vezes, no entanto, o Unicode é caracterizado (mesmo no padrão Unicode!) Como "ASCII amplo". Esse é um slogan que tenta transmitir principalmente a idéia de que Unicode deve ser um código de caractere universal da mesma maneira que o ASCII era uma vez (embora o repertório de caracteres do ASCII fosse irremediavelmente insuficiente para uso universal), ao contrário de usar códigos diferentes em diferentes sistemas e aplicativos e para diferentes idiomas.

Unicode, como tal, define apenas o "tamanho lógico" dos caracteres: cada caractere tem um número de código em um intervalo específico. Esses números de código podem ser apresentados usando diferentes codificações de transferência e, internamente, na memória, os caracteres Unicode geralmente são representados usando uma ou duas quantidades de 16 bits por caractere, dependendo do intervalo de caracteres, às vezes usando uma quantidade de 32 bits por caractere.

Jukka K. Korpela
fonte
2
Eu acho que a codificação mais comum para Unicode é UTF-8 atualmente. UTF-8 codifica a maioria dos pontos de código em 1, 2 ou 3 bytes.
Binarus
14

ASCII e Unicode são codificações de dois caracteres. Basicamente, eles são padrões sobre como representar caracteres de diferença em binários, para que possam ser gravados, armazenados, transmitidos e lidos em mídia digital. A principal diferença entre os dois está na maneira como eles codificam o caractere e o número de bits que eles usam para cada um. O ASCII originalmente usou sete bits para codificar cada caractere. Mais tarde, isso foi aumentado para oito com o ASCII estendido, para tratar da aparente inadequação do original. Por outro lado, o Unicode usa um programa de codificação de bits variável, no qual você pode escolher entre codificações de 32, 16 e 8 bits. O uso de mais bits permite que você use mais caracteres à custa de arquivos maiores, enquanto menos bits oferecem uma opção limitada, mas você economiza muito espaço. Usando menos bits (ou seja,

Uma das principais razões pelas quais o Unicode foi o problema surgiu em muitos programas ASCII estendidos não padrão. A menos que você esteja usando a página predominante, usada pela Microsoft e pela maioria das outras empresas de software, é provável que encontre problemas com os caracteres que aparecem como caixas. O Unicode praticamente elimina esse problema, pois todos os pontos de código de caracteres foram padronizados.

Outra grande vantagem do Unicode é que, no máximo, ele pode acomodar um grande número de caracteres. Por esse motivo, atualmente o Unicode contém a maioria dos idiomas escritos e ainda tem espaço para ainda mais. Isso inclui scripts típicos da esquerda para a direita, como inglês, e até scripts da direita para a esquerda, como árabe. Chinês, japonês e muitas outras variantes também são representadas no Unicode. Portanto, o Unicode não será substituído em breve.

Para manter a compatibilidade com o ASCII mais antigo, que já era amplamente utilizado na época, o Unicode foi projetado de maneira que os oito primeiros bits correspondessem aos da página ASCII mais popular. Portanto, se você abrir um arquivo codificado em ASCII com Unicode, ainda obterá os caracteres corretos codificados no arquivo. Isso facilitou a adoção do Unicode, pois diminuiu o impacto da adoção de um novo padrão de codificação para aqueles que já estavam usando ASCII.

Resumo:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Retirado de: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs

Nikhil Katre
fonte
1

Armazenamento

Os números fornecidos são apenas para armazenar 1 caractere

  • ASCII ⟶ 2 7 bits ( 1 byte )
  • ASCII estendido ⟶ 2 8 bits (1 byte)
  • UTF-8 ⟶ mínimo 2 8 , máximo 2 32 bits (mínimo 1, máximo 4 bytes)
  • UTF-16 ⟶ mínimo 2 16 , máximo 2 32 bits (mínimo 2, máximo 4 bytes)
  • UTF-32 ⟶ 2 32 bits (4 bytes)

Uso (em fevereiro de 2020)

Porcentagens de sites que usam várias codificações de caracteres

Hasan Sefa Ozalp
fonte
0

O ASCII define 128 caracteres, pois o Unicode contém um repertório de mais de 120.000 caracteres.

sphynx888
fonte
4
-1 para esta "Resposta" duplicada trivial, sem acrescentar nada a Respostas anteriores muito anteriores. Por favor, não adicione confusão de duplicação como esta (obtenha representantes de outras maneiras legítimas).
Cellepo # 21/18
-1

Além de como o UTF é um superconjunto do ASCII, outra boa diferença a saber entre o ASCII e o UTF é em termos de codificação de arquivos em disco e representação e armazenamento de dados na memória aleatória. Os programas sabem que os dados fornecidos devem ser entendidos como uma seqüência de caracteres ASCII ou UTF, detectando códigos especiais de marca de ordem de bytes no início dos dados ou assumindo pela intenção do programador que os dados são texto e, em seguida, verificando se há padrões que indiquem que estão. em uma codificação de texto ou em outra.

Usando a notação de prefixo convencional de 0xdados hexadecimais, a referência básica boa é que o texto ASCII começa com valores de bytes 0x00para 0x7Frepresentar um dos possíveis valores de caracteres ASCII . O texto UTF normalmente é indicado iniciando com os bytes 0xEF 0xBB 0xBFpara UTF8. Para UTF16, inicie os bytes 0xFE 0xFFou 0xFF 0xFEseja usado, com a ordem de extremidade dos bytes de texto indicados pela ordem dos bytes de início. A simples presença de valores de bytes que não estão no intervalo ASCII de possíveis valores de bytes também indica que os dados provavelmente são UTF.

Existem outras marcas de ordem de bytes que usam códigos diferentes para indicar que os dados devem ser interpretados como texto codificado em um determinado padrão de codificação.

stackuser83
fonte