4
respostas

Windows e palavras com acentuação

Olá,

Comecei o curso de C agora pouco, instalei o GCC como recomendado e comecei a seguir o código das primeiras aulas.

Notei que, em Windows, printf com palavras acentuadas imprime caracteres estranhos, uma vez que o código está em UTF-8 e o prompt do Windows usa ANSI.

Procurando pela web, encontrei uma recomendação de como alterar a página de código do prompt para imprimir os caracteres. Achei, porém, um pouco longo demais, como podem ver:

#include <stdio.h>
#include <locale.h>
#include <windows.h>

int main() {
  // Define o valor das páginas de código UTF8 e default do Windows
  UINT CPAGE_UTF8 = 65001;
  UINT CPAGE_DEFAULT = GetConsoleOutputCP();

  // Define codificação como sendo UTF-8
  SetConsoleOutputCP(CPAGE_UTF8);

  // PROGRAMA : INICIO
  // --------------------------------------------------------------------

  printf("Bem vindo ao nosso jogo de adivinhação");

  // PROGRAMA : FINAL
  // --------------------------------------------------------------------

  // Retorna codificação padrão do Windows
  SetConsoleOutputCP(CPAGE_DEFAULT);
}

Digo longo não pelos comentários e etc., mas pelo fato de precisar do locale.h e windows.h.

Seria esta a melhor forma para imprimir os caracteres especiais no prompt do Windows?

Obrigado. :P

4 respostas

Oi Fábio! Beleza?

Eu só adicionei as duas últimas bibliotecas

locale.h

windows.h

E pontuação ficou correta!

Qual a utilidade de adicionar os demais códigos dentro do main?

Valeu!

Opa, Flavio, tranquilo?

Quando a gente usa:

SetConsoleOutputCP(CPAGE_UTF8);

É para mudar a página de código utilizada no prompt do Windows. Por padrão, o output dele é ANSI, então para imprimir caracteres especiais e acentos, precisamos mudar a página de código para UTF8.

Basicamente, o que fiz no programa foi alterar a página de código para UTF8 antes do programa rodar, e reverter para ANSI após ele rodar, pra manter o padrão do Windows.

Ainda não testei apenas incluir os headers, sem mudar a página, mas tive de usar essas mudanças quando precisei montar uma penca de batch file para automatizar umas coisas (por ex., eu acabei montando um batch file para simular o touch do Linux no Windows, assim como outros comandos :P).

Valeu a dica, vou testar aqui assim que possível, pois achei a minha solução grande demais :P

Flavio, tranquilo?

Qual versão do Windows e qual terminal está utilizando? Apenas adicionei os dois headers via GCC e não rolou, precisei ainda da troca de página de código. :/

Mesmo no Visual Studio 2017 chega a ser chatinho isso. Você precisa configurar headers, mudar code page e salvar o arquivo em UTF-8, pois o VS não realiza o save na codificação.

O jeito é continuar usando code page mesmo. :P

Em outro post um carinha resolveu da seguinte forma (funcionou para mim)

include int main() { setlocale (LC_ALL, "portuguese"); }