[Programadora Wannabe] O drama da acentuação do texto da variável exibido no printf...

Eu estava resolvendo alguns dos exercícios do livro de Algoritmos e Lógica de Programação II quando me deparei com um problema em um dos exercícios: o texto gravado na variável quando era exibido na tela, não exibia as palavras acentuadas.

Bem-vinda Lll de Ll! =D ... péra, quê??
Como vocês podem ver, esse exercício era bem simples: criar um algoritmo que deveria ler um nome que o usuário digitaria e então o exibiria na tela, em uma frase de boas-vindas. Meu nome não tem acento, então da primeira vez que eu fiz o exercício e testei não deu erro.


Nessa primeira versão eu ainda estava usando o gets no lugar do scanf porque com nome duplo, eu precisava de um comando que lesse espaços. Aí depois que eu aprendi a existência do fgets, que limita o número de caracteres lido pela máquina, diferente do gets que não limita, eu resolvi refazer o exercício com o fgets e na preguiça digitei um nome qualquer que deu o erro demonstrado na primeira imagem.

À primeira vista, esse problema parecia fácil de resolver, afinal existem tantos idiomas que possuem caracteres especiais que alguém com certexa já tinha dado um jeito. Mas infelizmente grande parte das soluções resolvia o problema do texto digitado no printf, mas não do texto que estava gravado na variável. Na maioria dos lugares onde procurei davam como solução usar a biblioteca #include <locale.h> e o setlocale(LC_ALL, "Portuguese"); que eu já estava usando, ou setlocale(LC_ALL, "");, que testado não funcionou.

Recorri ao grupo do facebook Mulheres Aprendendo Programação, onde foi sugerido que eu usasse setlocale(LC_ALL, "Portuguese_Brasil.1252"); e olha só: resolveu o problema do texto armazenado na variável :D
... mas zoou todo o resto, ehehehe! *lágrimas de desespero*


Uma das integrantes do grupo então, me passou esse link do Clube do Hardware, com diversas possíveis soluções, entre elas uma que demonstrava que o problema da acentuação tinha a ver com o console onde o programa estava sendo rodado. Assim, para corrigir bastava alterar o código de página usado no console para windows-1252 e correr para o abraço. Usei o código que a pessoa postou para resolver o problema e deu tudo certo! Yay!


Mas a essa altura vocês já devem ter percebido um porém: a biblioteca que o código usa, windows.h, ou seja, esse código funciona apenas no Windows. Ele não serve para outros sistemas operacionais, como Linux, por exemplo.

Assim, por agora as soluções mais simples para esse problema (que se revelou uma verdadeira bola de neve), e que funcionariam em qualquer console são:

- usar #include <locale.h> e setlocale(LC_ALL, "Portuguese"); e avisar que o texto a ser digitado não pode conter caracteres especiais;
- usar #include <locale.h> e setlocale(LC_ALL, "Portuguese_Brasil.1252"); e não utilizar nenhum caractere especial além do texto a ser gravado na variável;
- chorar de desespero por falar uma língua com tanto acento e caracteres especiais.

Atualização:
Há também a seguinte opção: usar #include <locale.h> e setlocale(LC_ALL, "Portuguese"); antes de cada printf com texto normal e setlocale(LC_ALL, "C"); antes de cada printf em que será escrito o conteúdo de uma variável.
Ela é trabalhosa no sentido de que a cada printf que vai ser escrito o conteúdo de uma variável, terá que ser feita a alteração, mas é simples. E funciona.

Nenhum comentário

Tecnologia do Blogger.