No momento, você está visualizando A tabela ASCII estendida

A tabela ASCII estendida

A tabela ASCII estendida foi desenvolvida para facilitar a comunicação entre diferentes dispositivos eletrônicos, especialmente computadores e periféricos, estabelecendo uma linguagem comum para o intercâmbio de informações textuais.

Por que foi estendida ?

A tabela original utilizava 7 bits para representar 128 caracteres, abrangendo as letras do alfabeto inglês (maiúsculas e minúsculas), os números de 0 a 9, sinais de pontuação, caracteres de controle e alguns símbolos específicos.

expansao-tabela-ascii-para-tabela-ascii-estendida

Com o passar do tempo e a expansão do uso dos computadores em diferentes partes do mundo, tornou-se evidente que o conjunto de 128 caracteres era insuficiente. No português, por exemplo, existem acentos e símbolos que não estavam contemplados no ASCII original. Diante dessa limitação, na década de 60, nos Estados Unidos, surgiam variações do código que acrescentavam 128 caracteres adicionais, passando de 7 para 8 bits, isto é, de 128 para 256 possibilidades. Essa ampliação ficou conhecida como  tabela ASCII estendida.

Aplicações

Na prática, a tabela ASCII estendida abrange um conjunto de tabelas diferentes criadas por fabricantes e desenvolvedores de sistemas operacionais ao redor do mundo. A IBM, por exemplo, criou a página de código 437, usada nos primeiros computadores pessoais, que incluía não apenas letras acentuadas, mas também símbolos gráficos, como molduras e setas.

Outras empresas e países desenvolveram variantes próprias, cada uma adaptada às suas necessidades linguísticas e culturais. Isso, entretanto, gerou certa fragmentação, pois o mesmo código numérico podia representar diferentes caracteres dependendo do padrão adotado, algo que dificultava a troca de arquivos entre sistemas distintos.

A tabela

Abaixo é apresentada a tabela ASCII estendida baseada na página de código 437 criada pela IBM.

Tabela ASCII Estendida Baseado na página de código 437 da IBM
Caractere Código Decimal Binário Significado / Descrição
12701111111Casa (símbolo gráfico)
Ç12810000000C cedilha maiúsculo
ü12910000001U minúsculo com trema
é13010000010E minúsculo com acento agudo
â13110000011A minúsculo com acento circunflexo
ä13210000100A minúsculo com trema
à13310000101A minúsculo com acento grave
å13410000110A minúsculo com anel
ç13510000111C minúsculo com cedilha
ê13610001000E minúsculo com acento circunflexo
ë13710001001E minúsculo com trema
è13810001010E minúsculo com acento grave
ï13910001011I minúsculo com trema
î14010001100I minúsculo com acento circunflexo
ì14110001101I minúsculo com acento grave
Ä14210001110A maiúsculo com trema
Å14310001111A maiúsculo com anel
É14410010000E maiúsculo com acento agudo
æ14510010001Ligadura “ae” minúscula
Æ14610010010Ligadura “AE” maiúscula
ô14710010011O minúsculo com acento circunflexo
ö14810010100O minúsculo com trema
ò14910010101O minúsculo com acento grave
û15010010110U minúsculo com acento circunflexo
ù15110010111U minúsculo com acento grave
ÿ15210011000Y minúsculo com trema
Ö15310011001O maiúsculo com trema
Ü15410011010U maiúsculo com trema
¢15510011011Símbolo de centavo
£15610011100Símbolo de libra esterlina
¥15710011101Símbolo de iene / yuan
15810011110Símbolo de peseta
ƒ15910011111Símbolo florim / gulden
á16010100000A minúsculo com acento agudo
í16110100001I minúsculo com acento agudo
ó16210100010O minúsculo com acento agudo
ú16310100011U minúsculo com acento agudo
ñ16410100100N minúsculo com til
Ñ16510100101N maiúsculo com til
ª16610100110Indicador ordinal feminino
º16710100111Indicador ordinal masculino
¿16810101000Ponto de interrogação invertido
16910101001Not sign invertido
¬17010101010Not logical (negação)
½17110101011Um meio
¼17210101100Um quarto
¡17310101101Ponto de exclamação invertido
«17410101110Aspas angulares esquerdas
»17510101111Aspas angulares direitas
17610110000Sombra leve (bloco gráfico)
17710110001Sombra média (bloco gráfico)
17810110010Sombra escura (bloco gráfico)
17910110011Linha vertical
18010110100Junção à direita
Á18110110101A maiúsculo com acento agudo
Â18210110110A maiúsculo com acento circunflexo
À18310110111A maiúsculo com acento grave
©18410111000Símbolo de copyright
18510111001Borda dupla à direita
18610111010Linha dupla vertical
18710111011Canto superior direito duplo
18810111100Canto inferior direito duplo
¢18910111101Símbolo repetido (centavo duplo)
¥19010111110Símbolo de iene (repetido)
19110111111Canto superior direito simples
19211000000Canto inferior esquerdo simples
19311000001Junção inferior simples
19411000010Junção superior simples
19511000011Junção à esquerda simples
19611000100Linha horizontal simples
19711000101Cruzamento simples
ã19811000110A minúsculo com til
Ã19911000111A maiúsculo com til
20011001000Canto inferior esquerdo duplo
20111001001Canto superior esquerdo duplo
20211001010Junção inferior dupla
20311001011Junção superior dupla
20411001100Junção à esquerda dupla
20511001101Linha horizontal dupla
20611001110Cruzamento duplo
¤20711001111Símbolo monetário genérico
ð20811010000Letra islandesa eth minúscula
Ð20911010001Letra islandesa Eth maiúscula
Ê21011010010E maiúsculo com acento circunflexo
Ë21111010011E maiúsculo com trema
È21211010100E maiúsculo com acento grave
ı21311010101I sem ponto (ponto turco minúsculo)
Í21411010110I maiúsculo com acento agudo
Î21511010111I maiúsculo com acento circunflexo
Ï21611011000I maiúsculo com trema
21711011001Canto inferior direito simples
21811011010Canto superior esquerdo simples
21911011011Bloco cheio
22011011100Bloco inferior
22111011101Bloco esquerdo
22211011110Bloco direito
22311011111Bloco superior
α22411100000Letra grega alfa minúscula
ß22511100001Letra alemã “eszett” (s forte minúsculo)
Γ22611100010Letra grega gama maiúscula
π22711100011Letra grega pi minúscula
Σ22811100100Letra grega sigma maiúscula
σ22911100101Letra grega sigma minúscula
µ23011100110Símbolo micro
τ23111100111Letra grega tau minúscula
Φ23211101000Letra grega fi maiúscula
Θ23311101001Letra grega teta maiúscula
Ω23411101010Letra grega ômega maiúscula
δ23511101011Letra grega delta minúscula
23611101100Símbolo de infinito
φ23711101101Letra grega fi minúscula
ε23811101110Letra grega épsilon minúscula
23911101111Operador interseção
24011110000Sinal de identidade
±24111110001Sinal de mais ou menos
24211110010Maior ou igual
24311110011Menor ou igual
24411110100Parte superior do símbolo de integral
24511110101Parte inferior do símbolo de integral
÷24611110110Sinal de divisão
24711110111Sinal de aproximadamente igual
°24811111000Símbolo de grau
24911111001Ponto médio (operador de multiplicação)
·25011111010Ponto central
25111111011Sinal de raiz quadrada
25211111100Expoente n (indicador de potência)
²25311111101Expoente 2
25411111110Quadrado cheio
 25511111111Espaço sem quebra (non-breaking space)

Note que a tabela inicia-se no código 127, isso porque ela é uma extensão da tabela ASCII original, logo os primeiros 128 símbolos então na tabela original e os seguintes encontram-se na tabela estendida.

Ainda é utlizada ?

Com o avanço da computação e da necessidade de padronização internacional, o uso da tabela ASCII estendida foi sendo gradualmente substituído por sistemas mais abrangentes, como o Unicode, criado na década de 1990. O Unicode permite representar praticamente todos os caracteres usados em todas as línguas do mundo, além de símbolos matemáticos, técnicos e emojis. Então, ele se tornou o padrão universal de codificação de texto, resolvendo o problema da incompatibilidade entre tabelas locais.

Contudo, a tabela ASCII estendida ainda tem relevância em alguns contextos. Ela é utilizada em sistemas legados, especialmente em softwares e equipamentos industriais antigos, que foram projetados antes da consolidação do Unicode. Em ambientes como consoles de terminal, linguagens de programação mais antigas e arquivos de texto de sistemas operacionais clássicos (como MS-DOS), ainda é possível encontrar o uso desse conjunto de caracteres.

Como desenhar com a linguagem C usando a tabela ASCII estendida

A aplicação muito comum para a tabela ASCII é fazer animações gráficas usando alguma linguagem de programação. Iremos ver adiante como fazer um carrinho e fazer com que ele ande usando a linguagem C. Para isso, iremos utilizar os códigos 219, 220, 223 e 79 da tabela (Olhe a coluna de decimais para ver o símbolo correspondente ao código).

Contudo precisamos destacar um possível problema em ambientes Linux. Se você está usando um computador com sistema operacional Linux ou até mesmo executando o código online, possívelmente você não verá um carrinho ser formado, mas o símbolo “?”. Isso acontece porque sistema operacionais baseados em Linux usam a tabela Unicode que é diferente da ASCII, logo os símbolos mostrado nessa tabela não são reconhecidos por ele. Mas fazemos também o mesmo código na versão Unicode, assim poderá executar o código também no Linux e funcionará normalmente.

Entretanto se você usa Windows não terá nenhum problema, pois o Windows mais recente embora não use tanto a tabela ASCII ele ainda dá suporte, porque ele mantêm a compatibilidade com o sistema de code pages do MS-DOS que usava a tabela ASCII na época. Manter essa compatibilidade é importante pois muitos sistemas bancários, softwares industriais e interfaces de BIOS ainda utilizam a tabela ASCII para funcionarem.

O desenho que será feito é de um CARRO !

Desenhando no Linux

Abaixo é apresentado o código que desenha um carro andando para a direita. Esse desenho foi feito usando a tabela Unicode.

Linguagem C
    #include <stdio.h>
#include <locale.h>
#include <unistd.h>

int main() {
    setlocale(LC_ALL, "");

    printf("\n\n");

    for(int i = 0; i < 100; i++) {

        printf("\033[2A"); 
  
        for(int j = 0; j < i; j++) printf(" ");
        printf("▄▄████▄▄        \n");

        for(int j = 0; j < i; j++) printf(" ");
        printf("▀O▀▀▀▀O▀        \n");

        fflush(stdout);
        usleep(80000);
    }
    return 0;
}
    
  

Explicação do código

Primeiramente, o código inclui três bibliotecas. A stdio.h é usada para entrada e saída padrão, principalmente o printf. A locale.h permite configurar a localização do programa com setlocale(LC_ALL, ""), o que é importante aqui porque o desenho utiliza caracteres especiais, que fazem parte de conjuntos estendidos de caracterespresentes no Unicode. Já a unistd.h fornece a função usleep, responsável por criar pequenos atrasos entre os quadros da animação.

No início da função main, o programa define a localidade do sistema, garantindo que os caracteres gráficos sejam exibidos corretamente no terminal. Em seguida, imprime duas quebras de linha apenas para dar um espaço inicial na tela.

A parte principal está no laço for(int i = 0; i < 100; i++). Esse laço controla os “quadros” da animação. A cada repetição, o valor de i aumenta, e isso determina o quanto o desenho será deslocado para a direita. Logo no começo do laço, o comando printf("\033[2A"); envia uma sequência de escape ANSI para o terminal. \033 representa o caractere ESC, e [2A significa “mover o cursor duas linhas para cima”. Isso faz com que o programa volte para a posição onde o desenho anterior foi impresso, permitindo sobrescrevê-lo e criar a ilusão de movimento, em vez de simplesmente imprimir novas linhas indefinidamente.

Depois disso, há dois blocos semelhantes. Em cada um, um laço interno for(int j = 0; j < i; j++) printf(" "); imprime vários espaços em branco. Como a quantidade de espaços depende de i, o desenho é deslocado progressivamente para a direita a cada iteração. Em seguida, são impressas duas linhas que formam o desenho.

O fflush(stdout); força a saída a ser exibida imediatamente no terminal, garantindo que a animação aconteça em tempo real, sem ficar presa em buffers de saída. Por fim, usleep(80000); pausa o programa por 80.000 microssegundos, controlando a velocidade da animação. Sem essa pausa, o movimento seria rápido demais para ser percebido.

Desenhando no Windows

Abaixo é apresentado o código que desenha um carro andando para a direita. Esse desenho foi feito usando a tabela ASCII estendida.

Linguagem C
    #include <stdio.h>
#include <locale.h>
#include <unistd.h>

int main() {
    setlocale(LC_ALL, "");

    printf("\n\n"); 

    for(int i = 0; i < 60; i++) {

        printf("\033[2A"); 
   
        for(int j = 0; j < i; j++) printf(" ");
        printf("%c%c%c%c%c%c%c%c   \n", 220,220,219,219,219,219,220,220);


        for(int j = 0; j < i; j++) printf(" ");
        printf("%c%c%c%c%c%c%c%c   \n", 223,79,223,223,223,223,79,223);

        fflush(stdout);
        usleep(80000);
    }

    return 0;
}

    
  

Explicação do código

O código acima possui o mesmo comportamento do primeiro, porém existem duas linhas que apresentam a dieferença de como é usar a tabela Unicode e usar a tabela ASCII, são elas:

  • printf("%c%c%c%c%c%c%c%c \n", 220,220,219,219,219,219,220,220);
  • printf("%c%c%c%c%c%c%c%c \n", 223,79,223,223,223,223,79,223);

A dúvida que pode ficar aqui é: Por que ele coloca %c para imprimir um char se ele está imprimindo um valor inteiro ?

Acontece que estou imprimindo um char, isto é, uma letra, o valor inteiro é apenas o código decimal dessa letra/símbolo na tabela ASCII. Consulte na tabela qual é o símbolo quando a coluna decimal possui os códigos 220, 219,223 e 79. Você notará que são as partes do carro que quando juntas o formam.

Execução do algoritmo

Veja como ficou a execução do código.

Deixe um comentário