Tabela ASCII
Referência completa dos 128 caracteres ASCII com códigos decimal, hexadecimal, octal e binário.
128 caracteres exibidos
Sobre o ASCII
O ASCII (American Standard Code for Information Interchange) é um padrão de codificação de caracteres de 7 bits que define 128 caracteres, numerados de 0 a 127.
Intervalos de caracteres
- 0–31 · Caracteres de controle (não imprimíveis)
- 32 · Espaço
- 33–47 · Pontuação e símbolos
- 48–57 · Dígitos 0–9
- 65–90 · Maiúsculas A–Z
- 97–122 · Minúsculas a–z
- 127 · DEL (excluir)
Qual é a diferença entre ASCII e Unicode?
O ASCII define 128 caracteres em 7 bits. O Unicode é um superconjunto que cobre mais de 149.000 caracteres de todos os sistemas de escrita do mundo.
Como usar esses códigos em programação?
Em JavaScript: String.fromCharCode(65) → "A". Em Python: chr(65). Em C: (char)65. Os valores hexadecimais e octais funcionam da mesma forma.
Como funciona
- Navegue pela tabela completa: os 128 caracteres ASCII aparecem em uma grade ordenada por ponto de código (de 0 a 127). Cada célula mostra o caractere visível (ou sua abreviação, no caso dos códigos de controle), o código decimal e os equivalentes hex / octal / binário.
- Filtre por categoria: use o menu suspenso para restringir a caracteres de controle (0-31), caracteres imprimíveis (32-126), letras, dígitos ou símbolos. Útil quando você só se importa com, digamos, o bloco de pontuação.
- Busca: a caixa de busca corresponde por nome de caractere («LF»), abreviação ou valor numérico (decimal ou hex). Digitar
0x41,65ouAleva todos à mesma célula. - Clique em uma célula para copiar qualquer uma de suas representações para a área de transferência. Prático quando você precisa de
\x1Bpara um escape ANSI,0x0Apara uma quebra de linha Unix ou o decimal32para um espaço.
Uma breve história do ASCII
O ASCII (American Standard Code for Information Interchange) foi proposto pelo engenheiro da IBM Bob Bemer ao subcomitê X3.2 da American Standards Association em maio de 1961, com o objetivo de substituir a dúzia de códigos de caracteres incompatíveis então em uso. A primeira edição publicada foi a ASA X3.4-1963; as letras minúsculas só chegaram na revisão de 1967. O padrão foi reafirmado várias vezes desde então sob o nome ANSI X3.4-1986, e forma a base de toda codificação de caracteres moderna por meio de seu gêmeo internacional, a ISO/IEC 646 (e a europeia ECMA-6).
Para uso em rede, o ASCII foi codificado pela RFC 20, «ASCII format for Network Interchange», publicada em 16 de outubro de 1969 e de autoria de Vint Cerf na UCLA. A recomendação da RFC («ASCII de 7 bits embutido em um byte de 8 bits cujo bit de ordem mais alta é sempre 0») ainda é a forma como toda linguagem de programação e todo protocolo modernos pensam o texto simples. O Governo Federal dos EUA, por ordem executiva do presidente Lyndon B. Johnson em 1968, tornou obrigatório o suporte a ASCII em todos os computadores federais a partir de 1 de julho de 1969, o que garantiu a adoção em toda a indústria.
Por que sete bits?
O comitê X3.2 ficou preso entre duas opções pouco atraentes. Um código de 6 bits (usado por alfabetos telegráficos mais antigos, como o ITA2) não era confiável: a inversão de um único bit em uma linha ruidosa podia decodificar errado todos os caracteres seguintes, caso calhasse de cair em um bit de deslocamento. Um código de 8 bits parecia um desperdício em uma época de memória cara e modems lentos. O meio-termo foi 7 bits = 128 pontos de código, deixando o oitavo bit livre para a paridade. Ajustar o bit de paridade de modo que cada byte tivesse um número total par (ou ímpar) de bits 1 capturava 100% dos erros de transmissão de bit único, exatamente o problema que os acopladores acústicos e os cabos seriais dos anos 1960 produziam.
À medida que as taxas de erro caíram e os modems ficaram mais rápidos, o oitavo bit foi reaproveitado. Várias páginas de código nacionais de «ASCII estendido» (Latin-1, Windows-1252, Mac Roman, KOI8-R, …) usavam os códigos 128-255 para letras acentuadas e caracteres de desenho de caixa, mas esses mapeamentos eram mutuamente incompatíveis e acabaram sendo substituídos pelo Unicode e pelo UTF-8.
O layout: 128 pontos de código
7 bits = 27 = 128 códigos distintos, organizados como 33 caracteres de controle (0-31 mais DEL em 127) e 95 caracteres imprimíveis (32-126):
| Faixa | Hex | Conteúdo |
|---|---|---|
| 0-31 | 00-1F | Caracteres de controle (NUL, BEL, BS, HT, LF, CR, ESC, FS-US, …) |
| 32 | 20 | SPACE, imprimível mas invisível |
| 33-47 | 21-2F | Pontuação: ! " # $ % & ' ( ) * + , - . / |
| 48-57 | 30-39 | Dígitos 0-9 |
| 58-64 | 3A-40 | Mais pontuação: : ; < = > ? @ |
| 65-90 | 41-5A | Maiúsculas A-Z |
| 91-96 | 5B-60 | Colchetes e acentos: [ \ ] ^ _ ` |
| 97-122 | 61-7A | Minúsculas a-z |
| 123-126 | 7B-7E | Chaves e til: { | } ~ |
| 127 | 7F | DEL, «rub out» (apagar) em fita de papel perfurada (binário 1111111) |
Caracteres de controle que ainda importam
A maioria dos 33 caracteres de controle surgiu como comandos de teletipo e de fita de papel e hoje são curiosidades históricas. Um punhado deles ainda é estrutural na computação do dia a dia:
- NUL (0x00): termina strings em C e em qualquer linguagem derivada de C. Colar um nulo embutido em um caminho de arquivo é uma forma clássica de derrubar código antigo.
- BEL (0x07,
\a): o bipe do terminal. Ainda é disparado porprintf '\a'. - BS (0x08,
\b): backspace. Usado por bibliotecas de barra de progresso para sobrescrever a linha anterior. - HT (0x09,
\t): tabulação horizontal. Define o caractere de tabulação usado em arquivos TSV e no eterno debate de indentação do interpretador Python. - LF (0x0A,
\n): avanço de linha. A quebra de linha do Unix. - CR (0x0D,
\r): retorno de carro. Metade da quebra de linha do Windows; usado sozinho para «voltar ao início da linha» em barras de progresso. - ESC (0x1B,
\e/\x1B): o caractere de escape. A invenção original de Bemer, hoje o prefixo de toda sequência de escape ANSI de terminal (cores, movimento de cursor, limpar a tela). - FS / GS / RS / US (0x1C-0x1F): separadores de Arquivo / Grupo / Registro / Unidade. Projetados para armazenamento em fita orientado a registros nos anos 1960 e em grande parte esquecidos, até que a RFC 7464 «JSON Text Sequences» trouxe o RS de volta como delimitador de prefixo para registros JSON em streaming (
application/json-seq). O GS ainda aparece em alguns protocolos de código de barras de varejo. - DEL (0x7F): «rub out» (apagar). A tecla RUB OUT do Teletype Model 33 enviava o código 127 porque, em binário, ele é
1111111: todos os sete bits ativados. Para apagar um caractere em fita de papel, o operador recuava a fita e pressionava RUB OUT, perfurando todos os furos existentes. O receptor deveria ignorar qualquer byte que fosse todo composto de 1s.
As guerras dos fins de linha
Três plataformas escolheram três convenções diferentes, e o software paga por isso desde então. A origem mecânica é a máquina de escrever e o teletipo, em que duas ações separadas eram necessárias: o retorno de carro movia a cabeça de impressão de volta à coluna 1, e o avanço de linha avançava o papel em uma linha. Sistemas diferentes tomaram decisões diferentes sobre codificar isso como um byte ou dois:
| SO | Quebra de linha | Bytes | Escape |
|---|---|---|---|
| Unix / Linux / macOS moderno | LF | 0x0A | \n |
| Mac OS clássico (anterior ao OS X) | CR | 0x0D | \r |
| Windows / DOS | CRLF | 0x0D 0x0A | \r\n |
Os protocolos da internet em geral exigem CRLF: HTTP, SMTP, FTP, MIME e o Internet Message Format padrão todos o especificam. A RFC 5322 é inequívoca: «CR e LF DEVEM ocorrer apenas juntos, como CRLF; NÃO DEVEM aparecer de forma independente» no corpo da mensagem. Dentro do código-fonte, porém, a convenção varia conforme a equipe, e é por isso que o git vem com o core.autocrlf: com true no Windows, o git extrai os arquivos como CRLF na árvore de trabalho, mas os armazena como LF no repositório, de modo que o mesmo arquivo de código produz o mesmo hash de blob em todas as plataformas. Uma entrada .gitattributes como * text=auto é a alternativa no nível do projeto.
Sequências de escape ANSI para cor no terminal
O caractere de escape (ESC, 0x1B) é o prefixo das sequências de escape ANSI que colorem a saída do terminal. O padrão é o ECMA-48 (1976), depois espelhado como ANSI X3.64 e incorporado à ISO/IEC 6429. A gramática é ESC [ + parâmetros + uma letra final; a parte ESC [ é chamada de Control Sequence Introducer (CSI) e é escrita de várias formas: \e[, \x1b[ ou \033[, dependendo da linguagem. Códigos comuns de Select Graphic Rendition:
0: redefinir / normal ·1: negrito ·4: sublinhado ·7: vídeo reverso30-37: cor de primeiro plano (preto, vermelho, verde, amarelo, azul, magenta, ciano, branco)40-47: cor de fundo (mesma ordem)90-97/100-107: primeiro plano / fundo brilhante
Assim, printf '\033[1;31mERROR\033[0m' imprime «ERROR» em vermelho e negrito e redefine em seguida. Todo emulador de terminal moderno (e o Windows Terminal desde 2019) suporta essas sequências.
ASCII vs. Unicode e UTF-8
O ASCII define 128 pontos de código; o Unicode 16.0 (lançado em 2024) cobre mais de 154.000. A ponte crucial é o UTF-8, a codificação de texto dominante na web (usada por ~98% dos sites em 2026): o UTF-8 é projetado de modo que qualquer byte ASCII de 7 bits (0x00-0x7F) codifique o mesmo caractere de sempre, com o bit mais alto em zero. A consequência prática é que todo arquivo ASCII válido também é um arquivo UTF-8 válido, byte a byte idêntico. Os pontos de código acima de 127 são codificados como sequências de múltiplos bytes (de 2 a 4 bytes) com o bit mais alto ativado em cada byte, o que garante que os parsers ASCII legados nunca os confundam com caracteres ASCII.
ASCII em linguagens de programação comuns
| Linguagem | Código → caractere | Caractere → código |
|---|---|---|
| JavaScript | String.fromCharCode(65) | 'A'.charCodeAt(0) |
| Python | chr(65) | ord('A') |
| C / C++ | (char)65 | (int)'A' |
| Java | (char) 65 | (int) 'A' |
| Rust | char::from(65) | 'A' as u32 |
| Go | string(rune(65)) | int('A') |
| Bash / sh | printf '\x41' | printf '%d' "'A" |
| HTML | A ou A | - |
| Codificação de URL | %41 = «A», %20 = espaço | - |
O truque do bit de caixa
Uma propriedade pequena, mas elegante, do layout do ASCII: uma letra maiúscula e sua equivalente minúscula diferem em exatamente um bit. A é 65 = 0100 0001; a é 97 = 0110 0001. Apenas o bit 5 difere. Isso torna a comparação sem distinção de maiúsculas e minúsculas uma única operação bit a bit: x | 0x20 força a minúscula, x & 0xDF força a maiúscula, ambas mais rápidas que uma tabela de consulta. Essa foi uma escolha de projeto deliberada na revisão de 1967 e é uma das razões pelas quais o layout parece «aleatório» em alguns pontos: ele codifica propriedades amigáveis ao hardware, não apenas a ordem alfabética.
Armadilhas comuns
- Confundir o dígito 0 com o caractere de controle NUL. NUL é o código 0; o caractere «0» é o código 48. Os dois não são intercambiáveis em nenhuma linguagem de programação.
- Supor que um byte é um caractere. Só é verdade para texto ASCII. O texto UTF-8 tem caracteres de largura variável, então o comprimento em bytes e a contagem de caracteres podem divergir muito para escritas não latinas.
- Misturar fins de linha dentro de um arquivo. CR / LF / CRLF misturados no mesmo arquivo confundem muitos parsers e produzem linhas em branco fantasmas ou quebras de linha ausentes, dependendo de qual SO o abre.
- Erro de um a mais ou um a menos na terminação de strings em C. Esquecer que as strings precisam de um byte extra para o NUL final é a vulnerabilidade original de estouro de buffer.
- Supor que o «ASCII estendido» é portável. Os códigos 128-255 significam caracteres diferentes em Latin-1, Windows-1252, KOI8-R, Mac Roman, etc. O UTF-8 é a única escolha moderna segura.
- ESC embutido em entrada não confiável. Se você registra dados fornecidos pelo usuário em um terminal sem sanitizá-los, um atacante pode injetar sequências de escape ANSI que mudam a cor, movem o cursor ou limpam a tela, às vezes ocultando conteúdo malicioso.
Perguntas frequentes
Por que o DEL tem o código 127 em vez de 0?
Porque 127 em binário é 1111111: todos os sete bits ativados. Para apagar um caractere em fita de papel perfurada, o operador recuava a fita e pressionava RUB OUT, que perfurava todos os furos existentes. O receptor deveria ignorar qualquer byte que fosse todo composto de 1s, de modo que o caractere «apagado» ficava invisível nas leituras seguintes. A convenção foi herdada de códigos de teletipo anteriores.
O que é o «ASCII estendido» e é seguro usá-lo?
O ASCII padrão cobre os pontos de código 0-127 (7 bits). «ASCII estendido» se refere, de forma imprecisa, a codificações de 8 bits que preenchem os pontos de código 128-255 com caracteres adicionais, como Latin-1, Windows-1252, KOI8-R, Mac Roman e muitas outras. O problema: os caracteres extras significam coisas diferentes em cada codificação. O nome é tecnicamente impróprio (essas páginas de código não são extensões do padrão ASCII) e não são seguras entre sistemas. O UTF-8 é o substituto moderno e portável, e é retrocompatível com a faixa original 0-127.
Por que o espaço (32) é considerado «imprimível» se não mostra nada?
Porque ocupa espaço horizontal em uma linha impressa: ele avança a cabeça de impressão exatamente como uma letra faz. Os caracteres de controle, em contraste, mudam o estado do dispositivo sem produzir saída visível (o BEL apita, o BS move a cabeça para trás, o LF avança o papel). A classificação se baseia no que o caractere faz em uma impressora, não em se ele tem um glifo.
CR e LF são a mesma coisa que o Enter do meu teclado?
Em geral, sim, mas o byte que seu teclado gera depende do SO. No Windows, pressionar Enter normalmente produz CRLF (0x0D 0x0A); no Linux e no macOS moderno, apenas LF (0x0A); no Mac OS clássico anterior ao X, apenas CR (0x0D). Muitos editores normalizam isso ao salvar, com base nos fins de linha já existentes no arquivo ou na convenção configurada do projeto.
Por que os separadores de arquivo/grupo/registro/unidade estão aqui?
Eles foram projetados para armazenamento em fita orientado a registros nos anos 1960: Arquivo > Grupo > Registro > Unidade. Em grande parte caíram em desuso, mas voltaram em dois lugares surpreendentes: a RFC 7464 «JSON Text Sequences» (tipo de mídia application/json-seq) usa o RS (0x1E) como prefixo para delimitar registros JSON transmitidos, e o separador de Identificador de Aplicação GS1 nos protocolos de código de barras de varejo usa o GS (0x1D).
O ASCII ainda é relevante em 2026?
Muito. Todo protocolo moderno que é «baseado em texto» (cabeçalhos HTTP, JSON, YAML, código-fonte, argumentos de linha de comando, variáveis de ambiente, nomes de host DNS) opera dentro da faixa do ASCII. O UTF-8 é a codificação dominante para texto arbitrário, mas os primeiros 128 valores de byte do UTF-8 são exatamente o ASCII, byte a byte. Conhecer a tabela ainda é necessário para qualquer coisa, da codificação de URL à cor no terminal e à depuração de bugs de codificação de texto.