O código ASCII é de 7 ou 8 bits?

100

Meu professor me disse que ASCII é um esquema de codificação de caracteres de 8 bits. Mas é definido apenas para códigos 0-127, o que significa que pode caber em 7 bits. Portanto, não se pode argumentar que o bit ASCII é, na verdade, um código de 7 bits?

E o que queremos dizer quando afirmamos que ASCII é um código de 8 bits?

Anurag Kalia
fonte

Respostas:

91

ASCII foi originalmente concebido como um código de 7 bits. Isso foi feito bem antes dos bytes de 8 bits se tornarem onipresentes e, mesmo na década de 1990, era possível encontrar software que presumia que poderia usar o 8º bit de cada byte de texto para seus próprios fins ("não limpo de 8 bits"). Hoje em dia as pessoas pensam nisso como uma codificação de 8 bits em que os bytes 0x80 a 0xFF não têm significado definido, mas isso é um retcon .

Existem dezenas de codificações de texto que fazem uso do 8º bit; eles podem ser classificados como compatíveis com ASCII ou não, e com largura fixa ou variável. Compatível com ASCII significa que, independentemente do contexto , bytes únicos com valores de 0x00 a 0x7F codificam os mesmos caracteres que em ASCII. Você não quer se envolver com uma codificação de texto não compatível com ASCII, se puder evitá-la; programas ingênuos que esperam ASCII tendem a interpretá-los erroneamente de maneira catastrófica, muitas vezes quebrando a segurança. Eles estão tão obsoletos hoje em dia que (por exemplo) o HTML5 proíbe seu uso na Web pública, com a infeliz exceção do UTF-16 . Não vou mais falar sobre eles.

Uma codificação de largura fixa significa o que parece: todos os caracteres são codificados usando o mesmo número de bytes. Para ser compatível com ASCII, uma codificação fixa com deve codificar todos os seus caracteres usando apenas um byte, portanto, não pode ter mais de 256 caracteres. A codificação mais comum hoje em dia é Windows-1252 , uma extensão do ISO 8859-1 .

Há apenas uma codificação compatível com ASCII de largura variável que vale a pena conhecer hoje em dia, mas é muito importante: UTF-8 , que compacta todo o Unicode em uma codificação compatível com ASCII. Você realmente deseja usar isso, se puder.

Como uma nota final, "ASCII" hoje em dia tem sua definição prática do Unicode, não seu padrão original (ANSI X3.4-1968), porque historicamente havia várias dezenas de variações no repertório de 127 caracteres ASCII - por exemplo, alguns de a pontuação pode ser substituída por letras acentuadas para facilitar a transmissão do texto em francês. Hoje em dia, todas essas variações são obsoletas, e quando as pessoas dizem "ASCII", isso significa que os bytes com valor 0x00 a 0x7F codificam pontos de código Unicode U + 0000 a U + 007F. Isso provavelmente só importará para você se você se pegar escrevendo um padrão técnico.

Se você estiver interessado na história do ASCII e nas codificações que o precederam, comece com o artigo "The Evolution of Character Codes, 1874-1968" (cópia samizdat em http://falsedoor.com/doc/ascii_evolution-of- character-codes.pdf ) e, em seguida, perseguir suas referências (muitas das quais não estão disponíveis online e podem ser difíceis de encontrar mesmo com acesso a uma biblioteca universitária, lamento dizer).

zwol
fonte
1
Então o ASCII é atualmente de 7 bits ou 8 bits? Você diz que agora usa 0x00-0x7F, obviamente. Mas contamos o 0 inicial?
Anurag Kalia
8
Isso depende de que tipo de pedante você é. A especificação que ainda define oficialmente ASCII (ANSI X3.4-1968) descreve-o como uma codificação de 7 bits, mas ninguém mais transmite bytes de 7 bits, e a interoperabilidade hoje em dia dita que o oitavo bit deve ser zero - você não pode use-o para um bit de paridade ou semelhante. Portanto, é igualmente válido IMNSHO descrever ASCII como uma codificação de oito bits que deixa a metade superior de seu espaço numérico como "reservado, não use". De qualquer maneira, se você transmitir oito bits bytes qualquer um que tem o seu conjunto pouco alto, você está não transmitir ASCII válido.
zwol
1
(... mas você pode estar transmitindo outra coisa válida, como UTF-8 ou ISO 8859-1 ou KOI8-R.)
zwol
1
Para ser realmente pedante, o padrão agora é INCITS 4-1986 [R2012] porque ASC anteriormente conhecido como X3 sofreu mutação em NCITS e depois em INCITS. Mas as variantes de 7 bits com cerca de uma dúzia de letras acentuadas para francês, alemão, espanhol, etc. não são ANSI / INCITS nada, e sim ISO / IEC 646 e ECMA-6. E é 8 bits (ISO / IEC) 8859-1 que forma o primeiro bloco de 256 caracteres do Unicode.
dave_thompson_085
2
@ dave_thompson_085 Nem todo mundo é tão pedante quanto você - o que significa que você pode encontrar documentação técnica mais antiga, e até mesmo padrões, que fazem referência a "ASCII", ou mesmo a "X3.4-1968", pretendendo incluir as variantes nacionais, ou pelo menos não descartando claramente, levando a discussões. Portanto, eu pessoalmente usaria o Unicode como referência normativa para ASCII se tivesse que escrever uma especificação onde fosse importante. Isso é tudo que eu quis dizer.
zwol
14

No Linux man asciidiz:

ASCII é o código padrão americano para intercâmbio de informações. É um código de 7 bits.

BeniBela
fonte
9

A tabela ASCII original é codificada em 7 bits, portanto, possui 128 caracteres.

Hoje em dia a maioria dos leitores / editores usa uma tabela ASCII "estendida" (da ISO 8859-1 ), que é codificada em 8 bits e tem 256 caracteres (incluindo Á , Ä , Œ , é , è e outros caracteres úteis também para idiomas europeus como glifos matemáticos e outros símbolos).

Enquanto UTF-8 usa a mesma codificação como a tabela básica ASCII (significado 0x41é Um em ambos os códigos), ele não compartilha a mesma codificação para o bloco "Latim estendido-A". O que às vezes faz com que caracteres estranhos apareçam em palavras como à la carte ou piñata .

Guillaume
fonte
Existem vários erros acima. Œ não faz parte da ISO 8859-1, embora seja no CP-1252 . E o bloco Latino Extended-A não são os primeiros 128 ou 256 caracteres do Unicode: é o próximo bloco após estes conterem letras como ğ, ł e ſ.
Richard Smith
Bom ponto! Acho que quis dizer "Suplemento Latim-1". Padrões de padrões ...
Guillaume
1
Existem muitos conjuntos de caracteres "Extended ASCII" e apenas um deles é o ISO 8859-1. O termo é quase sem sentido porque quando você está codificando e decodificando texto, você precisa saber qual codificação de caractere específica está sendo usada (e pode nem ser para um conjunto de caracteres ASCII estendido).
Tom Blodget
2

A codificação ASCII é de 7 bits, mas, na prática, os caracteres codificados em ASCII não são armazenados em grupos de 7 bits. Em vez disso, um ASCII é armazenado em um byte, com o MSB geralmente definido como 0 (sim, é desperdiçado em ASCII).

Você pode verificar isso inserindo uma string no conjunto de caracteres ASCII em um editor de texto, definindo a codificação para ASCII e visualizando o binário / hex:
insira a descrição da imagem aqui

A parte: o uso de codificação (estritamente) ASCII agora é incomum, em favor de UTF-8 (que não desperdiça o MSB mencionado acima - na verdade, um MSB de 1 indica que o ponto de código está codificado com mais de 1 byte).

flow2k
fonte
0

O código ASCII original fornecia 128 caracteres diferentes numerados de 0 a 127. ASCII a 7 bits são sinônimos, visto que o byte de 8 bits é o elemento de armazenamento comum, o ASCII deixa espaço para 128 caracteres adicionais que são usados ​​para idiomas estrangeiros e outros símbolos. Mas o código de 7 bits foi criado antes do código de 8 bits. ASCII significa Código Padrão Americano para Intercâmbio de Informações. Nos primeiros sistemas de correio da Internet, ele suportava apenas códigos ASCII de 7 bits, porque ele podia executar programas e arquivos multimídia em sistemas de suck. Esses sistemas usam 8 bits do byte, mas então ele deve ser transformado em um formato de 7 bits usando métodos de codificação como MIME, UUcoding e BinHex. Isso significa que o 8 bits foi convertido em caracteres de 7 bits, o que adiciona bytes extras para codificá-los.

Brookey
fonte
-3

quando chamamos ASCII como código de 7 bits, o bit mais à esquerda é usado como bit de sinal, então com 7 bits podemos escrever até 127. isso significa de -126 a 127 porque o valor máximo de imam de ASCII é de 0 a 255. isso pode ser apenas satisfeito com o argumento de 7 bits se o último bit for considerado como um bit de sinal

aju
fonte
Como pode um personagem ter um sinal?
Oleh Misarosh