Skip to content

Como Representar Texto: Código ASCII

Pense numa coisa estranha: computadores não sabem o que é uma letra. Não sabem mesmo!

Você está lendo isso agora e lendo várias letras e palavras na sua tela, mas já sabe que o computador só guarda números. Então a pergunta é inevitável: como raios isso é possível?

Como nasce um código

Na subseção O que o sistema unário nos ensina, fiz um desafio para você, onde combinamos que o risco na horizontal simbolizaria duas unidades ao invés de uma, e a vertical continuaria valendo uma, e escrevi alguns riscos no papel para você tentar adivinhar quantas vezes eu olhei para a minha gata enquanto escrevia aquela seção.

Relembre o desenho
Vezes que olhei para minha gataVezes que olhei para minha gata
Vezes que olhei para minha gata Richard Dias Alves @ Ultimate Rust, 2025. Licença CC BY-NC-SA 4.0.
Resposta

A resposta era 7 vezes.

Faremos a mesma coisa agora. Eu escreverei uma palavra usando apenas números, e você deve tentar me dizer que palavra é essa.

Pronto?

Adivinhe a palavra abaixo:

7899 256

Resposta

A palavra é: Ok.


Você deve estar se perguntando "mas como haveria eu de saber?". Eu tenho que lhe pedir desculpas antecipadamente, mas a verdade é que não havia como. Não tinha como você saber que o número significava aquela palavra apenas com as informações que você tinha.

Quando eu fiz os riscos, eu informei que o risco na horizontal significaria duas unidades, e você só soube interpretar o desenho porque nós combinamos o significado de cada símbolo. O desenho que eu fiz, por mais bobo que seja (eram só riscos), é um código.

Código nada mais é do que um sistema em que símbolos possuem significado previamente combinado.

  • Um código postal é um código: cada conjunto de números está associado a uma localização específica.
  • Código morse é um código: cada sequência de bips está associado a uma letra específica.
  • Uma palavra é um código: cada conjunto de letras está associado a um significado específico.

Se você parar para pensar, muita coisa no mundo funciona com códigos. Mas só passa a ser código quando existe um significado por trás. Eu não tinha dito para você que o número 7899 representava a letra O e que o número 256 representava a letra k.


Sabendo disso, agora sim vamos criar um código. Vamos combinar que cada letra tem um número associado a ela, respeitando a seguinte tabela:

Número1234567891011121314151617181920212223242526
LetraABCDEFGHIJKLMNOPQRSTUVWXYZ

Adivinhe a palavra abaixo:

21 12 20 9 13 1 20 5

Resposta

A palavra é: ULTIMATE.

Viu? Bem mais fácil agora. É assim que nasce um código, e é exatamente assim que nasce o código ASCII também.

Mas você reparou no que acabou de acontecer agora? Não reparou? Você leu números e conseguiu interpretar como letras. Isso é fenomenal! Pense bem, quando você entrou na seção, a dúvida era como raios era possível o computador exibir letras se tudo o que existia dentro dele eram números (mais precisamente, vários 0s e 1s), e agora parece que as peças estão se encaixando, está começando a fazer sentido e provavelmente tem alguma ideia começando a surgir na sua cabeça que alguns números específicos signifiquem coisas como letras, sinais, cores, etc... e é exatamente isso mesmo, mas você entenderá mais ao longo da seção.

Para ilustrar melhor e recapitular o que já vimos até aqui, vamos recapitular brevemente:

  • Com vários bits (0s e 1s) podemos formar um número especifico. Por exemplo, o número binário 1001 é a mesma coisa que o número decimal 9.
  • Podemos criar um código entre nós onde cada número representa algum símbolo específico, previamente acordado entre nós.

Agora, vamos tentar fazer a mesma coisa que fizemos acima, porém com números binários. Você pode considerar a mesma tabela de cima, onde cada número de 1 a 26 corresponde a uma letra em ordem alfabética, como sendo o nosso código ainda.

Adivinhe as palavras abaixo:

Dica

Utilize o que você aprendeu na subseção E no binário para converter números binários para decimais.

  1. 10 1001 10100
Resposta

A palavra é: BIT.

  1. 10010 10101 10011 10100
Resposta

A palavra é: RUST.


O que você acabou de fazer é exatamente o que um computador faz toda vez que precisa interpretar um texto. Ele converte bits para letras e depois imprime na tela.

Mas repare bem no problema que está escondido aqui: A nossa tabela foi uma combinação nossa, entre você e eu. Tal como se uma terceira pessoa visse aqueles riscos na horizontal não saberia traduzir para uma quantidade, se essa mesma terceira pessoa visse o número 18, não saberia que signica R. E mais ainda, essa terceira pessoa poderia simplesmente ter combinado com os outros que 18 significa a letra X. Ou o símbolo @. Ou uma ovelha. O código só funciona porque nós dois usamos a mesma tabela. Se mudar a tabela, muda o significado de tudo.

Agora volte algumas décadas atrás, e pense comigo no problema que estava surgindo naquela época: computadores de fabricantes diferentes, em países diferentes, sendo usado por pessoas diferentes, precisando trocar texto entre si. Isso realmente estava começando a acontecer e era UM CAOS! Um computador podia entender que 18 era X, outro podia entender que 18 era $, e exibia normalmente conforme entendia, sem dar nenhum erro - afinal, 18 faz sentido para ele, só significava outra coisa.

Isso não é hipotético. Antes de existir um padrão, era literalmente o que acontecia. Nos anos 1950 e 1960, cada fabricante de computador criava sua própria tabela de código. A IBM usava uma, a DEC outra, a Honeywell outra, e assim era para cada um dos outros fabricantes... Alguém precisava sentar e decidir, de uma vez por todas, qual número representa qual letra. E todo mundo precisava concordar.

A solução não podia vir de um único fabricante decidindo sozinho. Pensa comigo: Se a IBM simplesmente anunciasse "a partir de agora, todo mundo usa nossa tabela", a DEC e a Honeywell não teriam nenhuma obrigação de seguir. Por que seguiriam? Eram concorrentes. Ninguém iria abrir mão da própria tabela para adotar a da rival.

Precisava ser algo diferente: um acordo neutro. Uma tabela criada por uma organização neutra, que não fosse de nenhuma das empresas e não tivesse interesse comercial em nenhuma das tabelas que já existiam. Algo parecido com o que aconteceu quando países precisaram definir um fuso horário internacional, ou quando a indústria inteira precisa definir o tamanho padrão de um parafuso. Ninguém "ganha", todo mundo cede um pouco, e o resultado é um padrão que todos concordam em seguir.

Foi exatamente esse tipo de organização que resolveu esse problema. Em 1961, A ASA (American Standards Association), o instituto americano de padronização, formou um comitê com representantes dos fabricantes de computadores, empresas de telecomunicação e agências do governo. Durante dois anos, eles negociaram cada detalhe: quais símbolos incluir, qual número atribuir a qual letra, em que ordem organizar tudo.

Em 1963, o resultado foi publicado. O nome dele é ASCII.

A tabela que o mundo adotou

ASCII é uma sigla para American Standard Code for Information Interchange, que em português significa Código Americano Padrão para Intercâmbio de Informações. O ASCII nada mais é do que um conjunto de símbolos com números associados a eles, tal como fizemos acima. A diferença é que agora o mundo inteiro concorda com a mesma tabela.

Mas antes de você ver a tabela, uma pergunta: quantos símbolos diferentes você acha que o ASCII define?

A nossa tabela tinha 26 números, um para cada letra do alfabeto, e já foi suficiente para escrever ULTIMATE, BIT e RUST. Mas repare no que ela não consegue fazer: não tem como escrever Ultimate em vez de ULTIMATE. Não tem como diferenciar R de r. Nossa tabela não diferencia maiúsculas de minúsculas, mas se diferenciasse, quantos símbolos a mais precisaria? Outros 26, correto? Novamente um para cada letra, mas agora em minúsculo. Então já teríamos 52 entradas ao todo (26 letras maiúsculas + 26 letras minúsculas).

E se quiséssemos representar números também? Se eu quiser escrever "tenho 1 real", preciso de uma forma de representar o dígito 1 como saída, que é diferente do que uso como entrada para obter um símbolo como retorno. São mais 10 entradas na nossa tabela então, uma para cada dígito de 0 a 9. Já temos 62 entradas.

E a pontuação? ., ,, !, ?, :, ;, ', -, (, ), [, ]... Cada um desses é um símbolo que precisa de uma entrada. São mais algumas dezenas.

E o espaço entre as palavras? Esse também é um símbolo - invisível, mas presente. Sem ele, as palavras virariam aspalavras.

Quando comitê da ASA sentou para montar a tabela e foi listando tudo que precisaria incluir para cobrir o inglês escrito de forma completa (letras maiúsculas, minúsculas, dígitos, pontuação, espaço e ainda alguns símbolos especiais como @, #, $, &, etc...), chegou a um total de 95 símbolos imprimíveis.

Mas a tabela final do ASCII não tem 95 entradas, tem 128.

As 33 entradas restantes são algo que você provavelmente não esperaria encontrar numa tabela de texto: são símbolos não-imprimíveis - símbolos que não são gráficos. São instruções para a própria máquina. E para entender por que elas existem, precisamos lembrar que o ASCII não foi criado só para computadores. Foi criado também para máquinas de telecomunicação, teletipos, impressoras... Esses equipamentos precisavam receber não só "qual caractere" imprimir , mas também "pule para a próxima linha", "volte o cursor para o início", "pare a transmissão". Essas instruções precisavam de representação na tabela também.

Essas entradas representam símbolos que chamamos de caracteres de controle, e eles ocupam as 32 posições iniciais da tabela ASCII (as posições de 0 a 31), e a posição final (127). Você os usa todos os dias sem saber. Por exemplo, toda vez que aperta Enter num editor de texto ou mensagem, o que é registrado é o caractere de número 10 na tabela, chamado de line feed, ou "avanço de linha". O avanço de linha é só um entre os 33 caracteres de controle. Existem muitos mais (outros 32).

Teletipo Modelo 33, um dos equipamentos de telecomunicação para os quais o ASCII foi criado, fotografado em 1963
Teletipo Modelo 33 (1963)Rama & Musée Bolo, CC BY-SA 2.0 FR, via Wikimedia Commons

Aqui está a tabela que eles definiram:

Ver a tabela ASCII completa

Caracteres de controle (0-31 e 127)

NúmeroSímboloSignificado
0NULNulo
1SOHInício do cabeçalho
2STXInício do texto
3ETXFim do texto
4EOTFim da transmissão
5ENQConsulta
6ACKConfirmação
7BELBipe sonoro
8BSBackspace
9HTTab horizontal
10LFNova linha
11VTTab vertical
12FFAvanço de página
13CRRetorno do cursor
14SOShift out
15SIShift in
16DLEEscape de enlace
NúmeroSímboloSignificado
17DC1Controle de dispositivo 1
18DC2Controle de dispositivo 2
19DC3Controle de dispositivo 3
20DC4Controle de dispositivo 4
21NAKConfirmação negativa
22SYNSincronização
23ETBFim do bloco
24CANCancelar
25EMFim do meio
26SUBSubstituir
27ESCEscape
28FSSeparador de arquivo
29GSSeparador de grupo
30RSSeparador de registro
31USSeparador de unidade
127DELApagar

Símbolos gráficos (32-126)

Número32333435363738394041424344454647
Símbolo(espaço)!"#$%&'()*+,-./
Número48495051525354555657585960616263
Símbolo0123456789:;<=>?
Número64656667686970717273747576777879
Símbolo@ABCDEFGHIJKLMNO
Número80818283848586878889909192939495
SímboloPQRSTUVWXYZ[\]^_
Número96979899100101102103104105106107108109110111
Símbolo`abcdefghijklmno
Número112113114115116117118119120121122123124125126
Símbolopqrstuvwxyz{|}~

Ao analisar a tabela, talvez surjam duas perguntas:

  1. Por que começa no 0 e não no 1? A resposta está no que você já aprendeu sobre números binários.

Como você deve imaginar, cada um dos números de entrada da tabela são lidos como bits pelo computador, e para representar as 128 entradas possíveis, bastam 7 bits. Com 7 bits você consegue representar 128 valores diferentes, e esses valores são 0, 1, 2, 3, ... até 127. Em binário vai de 0000000 a 1111111. O zero é um valor legítimo, tão representável quanto qualquer outro. Se a tabela começasse em 1 e fosse até 128, você estaria desperdiçando uma das 128 combinações possíveis de bits (a combinação 0000000 não representaria nada), e ainda precisaria de um bit a mais para representar o número 128 (10000000). E desperdício era algo que o comitê não podia se dar ao luxo, considerando que cada bit a mais custava muito caro na época.

Então a tabela começa em 0 não apenas porque sim, mas porque o 0 é o primeiro número que 7 bits conseguem representar. A tabela usa todas as 128 combinações possíveis, da 0000000 até a 1111111, sem desperdiçar nenhuma.

Isso também fecha o raciocínio da subseção A lógica das posições, onde eu disse que era importantíssimo lembrar do 0 como primeira casa e não o 1.

  1. E por que 128 ao todo?

Bom, menos que 128 você já viu que era incoveniente, porque pelas contas dos símbolos importantes necessários, já chegamos em uma quantidade que preciava de 7 bits para ser representada, então já que iriamos usar 7 bits, mais valia aproveitar e usar todas as 128 combinações, não é mesmo?

Mas por que não usar então mais que 7 bits? Assim teríamos mais símbolos representáveis, não é? Se usássemos 8 bits teríamos mais 128 combinações ainda, totalizando 256, já que 2⁸ = 256. A resposta volta para a questão que naquela época cada bit a mais era muito caro, e os 128 símbolos que já haviam decidido acima, já dava para representar perfeitamente tudo que o inglês escrito precisava, ainda com uma margem para o os caracteres de controle.

Dois detalhes que valem atenção

Analisando a tabela, você deve ter reparado também ainda em mais outras duas coisas curiosas.

A primeira é que o dígito 0 não está na posição 0 da tabela, está na posição 48. Por quê? Isso pode parecer estranho ou confuso, mas faz sentido quando você entende a distinção entre posição e símbolo. A confusão pode acontecer porque o símbolo 0 e a posição 0 da tabela parecem ser a mesma coisa, mas não são.

Pense assim: a letra A não está na posição 1 só porque é a primeira letra do alfabeto, como fizemos no código que foi criado por nós. Ela está na posição 65, porque foi essa posição que o comitê escolheu para ela. O A é um símbolo, um desenho visual, e esse símbolo recebeu o número 65.

O 0 é exatamente a mesma coisa: um desenho. O símbolo visual que representa o zero. Esse desenho recebeu o número 48 na tabela, assim como o A recebeu 65 e o B recebeu o 66.

A posição 0 da tabela pertence ao caractere de controle chamado null - uma instrução invisível usada no mundo da programação para marcar o fim de um texto, sem relação visual nenhuma com o símbolo 0. O null vive na posição zero, mas o símbolo 0 que você digita no teclado vive em outra posição (a 48). O null foi colocado na primeira posição intencionalmente, não por acaso.

Mas tem uma segunda coisa curiosa, e essa é mais interessante ainda.

O A maiúsculo está na posição 65, e o a minúsculo está na posição 97. A diferença é exatamente 32. Na tabela, a distância entre as letras minúsculas para as maiúsculas será sempre 32, e das maiúsculas para as minúsculas será sempre -32.

Verifique com algumas outras letras:

  • O B está na posição 66, somando 32 (66 + 32 = 98), o b realmente está na posição 98.
  • O C está na posição 67, somando 32, encontramos o c na posição 99.

Isso vale para todas as 26 letras sem exceção.

Isso não foi por coincidência ou por acidente. Foi uma escolha consciente do comitê, e a razão é tão elegante que chega a ser linda: a diferença de exatamente 32 significa que, em binário, a única coisa que muda entre uma letra maiúscula e sua minúscula correspondente, é um únito bit (o sexto a partir da direita). Veja:

ASCII para binárioASCII para binário
ASCII para binário Richard Dias Alves @ Ultimate Rust, 2025. Licença CC BY-NC-SA 4.0.

Isso é útil porque, dessa forma, para os programadores converterem uma letra maiúscula em minúscula, ou vice-versa, é a operação mais simples possível que um computador consegue fazer: é só ligar ou desligar um único bit. Os projetistas do ASCII não colocaram as letras nessas posições por acaso. Eles escolheram as posições pensando exatamente nisso.

Nota

Tá, preciso pausar o tom técnico aqui só para dizer: Isso é lindo. Tem coisas que merecem um momento de pura apreciação - e essa é uma delas. Um comitê de engenheiros nos anos 60, sem saber exatamente que tipo de futuro estava construindo, fez uma escolha tão bem pensada que ela ainda ressoa hoje em qualquer computador do planeta. Isso não é só engenharia, é quase poesia.

AVISO

Não confunda "enésima posição" com "posição n".

De forma mais didática: termos como "posição 4", ou "posição 10", por exemplo, são diferentes de "quarta posição" e "décima posição". Lembre-se que as posições começam a partir do 0, então, a primeira posição é a posição 0, a segunda posição é a posição 1, e assim por diante...

A limitação do ASCII

O ASCII resolveu um problema enorme para a época. Qualquer computador que seguisse o padrão conseguia trocar texto com qualquer outro. Uma mensagem escrita numa máquina da IBM agora poderia chegar legível numa máquina da DEC. O caos havia acabado.

Mas... como tudo que já vimos até aqui, o ASCII também não é perfeito e tem suas limitações. Repare numa palavra que você já leu algumas vezes nessa seção sem talvez ter prestado atenção: American. A sigla ASCII significa American Standard Code for Information Interchange. E isso não é só um detalhe.

O ASCII foi desenhado para a lingua inglesa, num momento em que computadores eram usados quase exclusivamente por americanos, em contextos acadêmicos e militares. Para eles, 128 símbolos eram mais do que suficientes. Mas conforme os computadores foram chegando para o resto do mundo, esse limite começou a doer.

Os inglês não tem acentos, e isso refletiu no ASCII. Dos 95 símbolos imprimíveis, não tem como escrever o ñ do espanhol, não existe o ü do alemão, o é do francês, o ç do português, o ø do norueguês. Nenhum caractere árabe, nenhum caractere chinês, nenhum japonês, nenhum hindi, nenhum grego ou russo... Com apenas 128 posições, das quais 33 já estavam ocupadas para caracteres de controle, simplesmente não havia espaço para incluir todos esses. E isso não é um erro, não foi "exclusão proposital". Simplesmente era suficiente para as necessidades e contexto daquela época. Mas conforme falei no parágrafo acima, conforme mais países foram aderindo à rede de comunicação internacional, precisavam ter seus caracteres sendo representados também.

Curiosidade

Até hoje, quando algum computador recebe instrução para exibir algum caractere que não consegue encontrar na sua tabela, ele não simplesmente trava ou dá erro. Ele exibe algo como ? no lugar e segue em frente. É a forma que os sistemas encontraram de dizer "recebi algo que não sei o que é".

Na prática, isso significa que a palavra "codificação", digitada num computador brasileiro e exibida num computador que só conhece ASCII puro, chega como codifica??o. O ç e o ã viram ?. Não é um defeito, ele só está fazendo o que foi programado para fazer. Esses símbolos simplesmente não existem no vocabulário dele.

Programadores de países não-anglófonos (aqueles onde o inglês não é a língua nativa), conviveram com esse problema por décadas - adaptando, improvisando, criando soluções parciais que resolviam o problema para um idioma, mas quebravam para o outro. Era o mesmo caos de antes do ASCII, só que desta vez em escala global. E a solução que surgiu, seguiu exatamente a mesma lógica que criou o ASCII: um acordo. Mas desta vez, um acordo numa escala que o comitê da ASA de 1961 provavelmente nunca imaginaria que seria possível. Não entre algumas entidades americanas, um acordo com o mundo inteiro. Mas como fazer isso?

Esse projeto existe, está em uso até hoje em qualquer computador moderno, inclusive no que você está usando agora - seja notebook, celular, tablet... e é o motivo pelo qual você consegue ler tudo que tem na tela do seu computador. Ele se chama Unicode.

É um dos projetos colaborativos mais ambiciosos que a computação já produziu. E é o que veremos a seguir.

Antes de avançar

  1. Você sabe dizer como computadores, que só entendem números, conseguem de repente exibir vários símbolos diferentes, como letras, sinais de pontuação, etc...?

  2. Você consegue explicar o que é codificação de caracteres e por que ela é necessária?

  3. Consegue dizer por que o ASCII tem 128 caracteres, nem mais, nem menos?

    • E por que ele, apesar de ter resolvido um problema enorme para e época, não era suficiente para o mundo inteiro?

Se consegue responder todas essas perguntas, você está pronto para a próxima seção.