Exibindo caracteres especiais no printf.

Ola pessoal, imagino que todo mundo que programa pela primeira vez no DEV C++, acha estranho quando tenta exibir uma palavra com acento e aparece caracteres bizarros na tela. Quem esta começando agora ou nunca percebeu isso, a figura 1 mostrar um exemplo de código onde temos algumas palavras acentuadas.
Figura 1. Código em C onde tentaremos exibir palavras com acento.
Quando compilamos e executamos o código acima, notamos que todas as letras que possuem acentos apresentam um problema. A letra acentuada é trocada por um caractere que não conseguimos ler conforme apresentado na Figura 2.
Esse problema ocorre porque o compilador não reconhece caracteres especiais (caracteres como símbolos e palavras com acentos) e no local onde esses caracteres deveriam ser exibidos o compilador substitui por outros símbolos que dificultam a leitura do texto. As setas mostradas na figura 2 indicam onde temos esses caracteres.
Figura 2. Exibição do código apresentado na figura 1 onde as letras com acento apresentam problemas de exibição

Para solucionar esse problema e apresentar o texto com a devida acentuação, temos duas opções: Ou iremos usar os recursos da tabela ASCII que mostrarei depois ou adicionar a biblioteca <locale.h> ao nosso código.

A biblioteca Locale permitirá que nosso compilador suporte configurações específicas regionais, como formatos de data específica e seus caracteres especiais (como acentos e símbolos de moeda corrente) usados num determinado país. Para especificar o país de qual gostaríamos usar os caracteres especiais, devemos usar a instrução setlocale.
A figura 3 mostra um código onde definiremos o padrão português para que os acentos sejam devidamente mostrados na tela. A saída de dados referente a compilação do código mostrado na figura 3 é apresentado na figura 4.
Figura 3. Código usando a biblioteca Locale e as definições em português.

Figura 4.  Exibição do texto com acentos graça ao código apresentado na figura 3.

A figura 5 mostra que qualquer carácter do teclado pode ser exibido sem erro com o uso da biblioteca locale.h.....

Figura 5. Todos os caracteres do teclado podem ser exibidos corretamente com o uso da biblioteca locale.


Caracteres especiais usando a tabela ASCII

Outra maneira de exibir caracteres especiais através do uso do printf é usando o código ASCII (American Standard Code for Information Interchange). O código ASCII (que em português significa Código Padrão Americano para o Intercâmbio de Informação) é um padrão de conversão onde cada caracter é representado por uma sequencia de 8 bits. Quando convertemos esse byte em decimal, temos um numero que podemos usar em nosso código.
Por exemplo, o código ASCII 130 equivale a letra "é", logo para exibir o "é" devemos criar uma variável char e atribuir a ela o seu equivalente decimal da tabela ASCII e exibi-la como char.

main()
{
     char teste;
     teste =130;   // equivalente do é em ASCII
     printf(" vamos exibir um caracter com acento usando ASCII  %c", teste);
     system("pause");
}

A figura 6 mostra como a mensagem será exibida e a seta vermelha indaca o carácter especial que será exibido.
Figura 6. Exibição de carácter especial usando código ASCII.

Olhando a codificação acima a pergunta que sempre me fazem é: Porque usar a tabela ASCII se posso usar a biblioteca locale?????
A resposta é simples, nem todos os caracteres da tabela ASCII aparecem no teclado. Para ter uma ideia de como podemos brincar com a tabela ASCII, a figura 7 mostra alguns exemplo que só podem ser exibidos via código ASCII.
Figura 7. Caracteres especiais que só podem ser exibidos usando a tabela ASCII.
Quer conhecer todos os códigos da tabela ASCII?  Clique aqui e acesse essa informação. Quem quiser o código em C da exibição acima, me envie uma mensagem via blog ou facebook....

Ainda ta com duvida, curta nossa pagina no facebook e poste sua duvida lá....

7 comentários:

  1. Obrigado Bruno, eu passei o ano passado inteiro escrevendo "eh" ao invés de "é". :I
    Ainda bem que encontrei seu blog.

    ResponderExcluir
  2. Mítico, me ajudou muito também.
    Muito Obrigado!

    ResponderExcluir
  3. Bom artigo, mas existem soluções mais eficientes. Fiz um post aqui.

    http://linguagemcfacil.mozello.com/conteudos/params/post/2016097/exibicao-definitiva-dos-caracteres-especiais-em-c

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir