Qual a diferença entre ASCII e Unicode?

Posso saber a diferença exata entre Unicode e ASCII?

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

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

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

Unicode é um superconjunto de ASCII, e os números de 0 a 128 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 encheckboxm em um byte de 8 bits, há inúmeras maneiras de armazenar caracteres Unicode em seqüências de bytes, como UTF-32 e UTF-8.

Entender porque o ASCII e o Unicode foram criados, em primeiro lugar, me ajudou a entender como eles realmente funcionam.

ASCII, origens

Como afirmado 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 o inglês.

O que? Por que apenas em inglês? Tantas línguas lá fora!

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. (aka diacríticos ).

ASCII estendido

Algumas pessoas inteligentes começaram a usar o oitavo bit (o bit usado para paridade) para codificar mais caracteres para suportar seu idioma (para suportar “é”, em francês, por exemplo). Apenas usando 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 este “ASCII estendido para 8 bits e não 7 bits como antes” poderia ser referido apenas como “ASCII estendido” ou “ASCII de 8 bits”.

Como @Tom apontou em seu comentário abaixo, não existe tal coisa como ” ASCII estendido “, mas esta é uma maneira fácil de se referir a este 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

ASCII Extended resolve o problema para linguagens baseadas no alfabeto latino … e as outras que precisam de um alfabeto completamente diferente? Grego? Russo? Chinês e os gostos?

Nós precisaríamos de um conjunto de caracteres inteiramente 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 ( veja esta tabela ).

Você não pode salvar texto em seu disco rígido como “Unicode”. Unicode é uma representação abstrata do texto. Você precisa “codificar” esta 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 em explicar o básico:

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

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

Mnemônica:

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

Nota:

Por que 2 ^ 7?

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

Fonte: Wikipedia e este ótimo post no blog .

ASCII tem 128 pontos de código, 0 a 127. Ele 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 . Texto codificado em uma página de código não pode ser lido corretamente por um programa que assume ou adivinhou em outra página de código.

O Unicode surgiu para resolver esse desastre. A versão 1 começou com 65536 pontos de código, geralmente codificados em 16 bits. Posteriormente estendido na versão 2 para 1,1 milhões 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 aparecia, usada pelos sistemas operacionais da Microsoft e da Apple, por exemplo. E tempos de execução de linguagem como o Java. A especificação v2 apresentou 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 ter 2 ou 4 bytes. Os pontos de código v1 originais levam 2 bytes, e os adicionais, 4.

Outra codificação de comprimento variável que é muito comum, usada em sistemas operacionais e ferramentas * nix é UTF-8, um ponto de código pode levar entre 1 e 4 bytes, os códigos ASCII originais levam 1 byte e o restante leva 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 freqüência, pois é um grande desperdício. Há outros, como UTF-1 e UTF-7, amplamente ignorados.

Um problema com as codificações UTF-16/32 é que a ordem dos bytes dependerá do endian-ness da máquina que criou o stream de texto. Então 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ódigo em algum grau, juntamente com debates acalorados entre os programadores que a escolha da UTF é “melhor”. Sua associação com os padrões do sistema operacional praticamente atrai as linhas. Uma contra medida é a definição de uma BOM, a Marca de Ordem de Byte, um ponto de código especial (U + FEFF, espaço de largura zero) no início de um stream de texto que indica como o restante do stream é codificado. Indica a codificação UTF e o endianess e é neutro para um mecanismo de renderização de texto. Infelizmente, é opcional e muitos programadores reivindicam seu direito de omiti-lo, por isso os acidentes ainda são bastante comuns.

O ASCII possui 128 posições de código, alocadas em caracteres charts e caracteres de controle (códigos de controle).

Unicode tem 1.114.112 posições de código. Cerca de 100.000 deles foram atualmente alocados para caracteres, e muitos pontos de código foram feitos permanentemente não-caracteres (ou seja, não foram usados ​​para codificar qualquer caractere) e a maioria dos pontos de código ainda não foi designada.

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

Às vezes, no entanto, Unicode é caracterizado (mesmo no padrão Unicode!) Como “wide ASCII”. Este é um slogan que principalmente tenta transmitir a idéia de que Unicode é um código universal de caracteres da mesma forma que o ASCII (embora o repertório de caracteres do ASCII fosse irremediavelmente insuficiente para uso universal), como oposto ao uso de códigos diferentes em diferentes sistemas e aplicações e para diferentes idiomas.

O Unicode, como tal, define apenas o “tamanho lógico” dos caracteres: Cada caractere possui 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 memory, caracteres Unicode são geralmente 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.

java fornece suporte para Unicode, ou seja, suporta todos os alfabetos mundiais. Portanto, o tamanho do char em java é de 2 bytes. E o intervalo é de 0 a 65535.

insira a descrição da imagem aqui

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ário para que possam ser gravados, armazenados, transmitidos e lidos em mídia digital. A principal diferença entre os dois é a maneira como eles codificam o caractere e o número de bits que eles usam para cada um. O ASCII usou originalmente sete bits para codificar cada caractere. Isso foi posteriormente aumentado para oito com Extended ASCII para resolver a aparente inadequação do original. Em contraste, o Unicode usa um programa de codificação de bit 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 às custas de arquivos maiores, enquanto menos bits oferecem uma opção limitada, mas você economiza muito espaço. Usar menos bits (ou seja, UTF-8 ou ASCII) provavelmente seria melhor se você estivesse codificando um documento grande em inglês.

Uma das principais razões pelas quais o Unicode foi o problema surgiu dos muitos programas ASCII estendidos não padrão. A menos que você esteja usando a página predominante, que é usada pela Microsoft e pela maioria das outras empresas de software, é provável que você encontre problemas com seus caracteres aparecendo como checkboxs. 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 causa disso, o Unicode contém atualmente a maioria das linguagens escritas e ainda tem espaço para ainda mais. Isso inclui scripts típicos da esquerda para a direita, como o inglês e até scripts da direita para a esquerda, como o árabe. Chinês, japonês e muitas outras variantes também são representadas no Unicode. Então, o Unicode não será substituído tão cedo.

Para manter a compatibilidade com o antigo ASCII, que já era amplamente usado na época, o Unicode foi projetado de tal forma que os primeiros oito bits correspondiam 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 o 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

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