Por quê a locale.h não está funcionando no Windows, mas está funcionando no Linux ?

1. Por quê a locale.h não está funcionando no Windows, mas está funcionando no Linux ?

João Lucas
Jluckmay

(usa Ubuntu)

Enviado em 09/07/2020 - 23:18h

Gente, desde quando comecei a estudar C queria imprimir palavras com acento, mas não dava. Então procurei por uma biblioteca que me possibilitasse fazer isso, encontrei uma única biblioteca para tal tarefa: a locale.h. Bem, até ai nada errado, porém quando eu fiz a compilação cruzada para gerar um executável para Windows e o testei com o Wine os acentos apareceram bugados e um amigo meu que programa no Windows está com esse mesmo problema, ele não consegue utilizar a função setlocale dessa biblioteca para fazer os caracteres especiais serem impressos no terminal.

Mas por que no Windows não funciona se no Linux vai? Há como fazer funcionar no Windows?

Busquei respostas para tais perguntas e em todos os cantos diz que funciona no Windows sim e que talvez tivesse que passar outros parâmetros. Passei tais parâmetros, mas não obtive sucesso em fazer a impressão de um acento se quer pelo Wine. Alguém sabe como resolver isso ou o porquê de funcionar em um mas não no outro?

Abaixo deixei prints de um código simples com a biblioteca rodando no Linux e no Windows.


  


2. Re: Por quê a locale.h não está funcionando no Windows, mas está funcionando no Linux ?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/07/2020 - 01:44h

A questão não é propriamente de locale do programa em C. Nem é uma questão simples

Nada, aliás, que diz respeito a internacionalização ou múltiplos idiomas é simples.

Pelo exemplo mostrado, parece que o problema é de interpretação do conjunto de caracteres em dois momentos distintos: na hora da compilação, por parte do compilador que está interpretando o código fonte, e no momento da execução, por parte do terminal (ou filtro que exista no Wine antes de jogar no terminal) a partir dos bytes que o programa joga na saída.

No caso do Linux, o mais comum nas distribuições modernas é que todo o sistema seja configurado para trabalhar com codificação UTF-8 do conjunto de caracteres Unicode. No Windows, até onde eu sei, o mais comum ainda é usar conjuntos de caracteres de oito bits, e as vezes conjuntos diferentes para aplicações em GUI (por exemplo: CP-1252, que o Windows às vezes chama de “ANSI”) e aplicações no console (por exemplo: CP-437 ou CP-850).

Se o seu código fonte foi escrito no Linux, é quase certo que aquele “é” foi codificado com UTF-8, o que implica que ele foi transformado em dois bytes. Ao ser compilado e executado no Windows, esses dois bytes foram compreendidos como dois caracteres distintos, já que todos os caracteres são representados com apenas um byte em todas as CPs de uso mais comum, tanto no console quanto na interface gráfica.

Eu não sei como resolver isso de modo 100% a prova de falhas. Você pode tentar programar o emulador de terminal do Windows para usar CP-65001, que é equivalente a UTF-8. Outra possibilidade é usar opções de compilação que providenciem a conversão entre o conjunto de caracteres/codificação utilizado no código fonte e o conjunto/codificação a ser usada na hora da execução (se é que existem opções que faça isso).

Existem abordagens alternativas, tais como usar diretamente no seu programa alguma biblioteca que faça conversões de conjuntos de caracteres, e você faria essas operações manualmente, a cada operação de entrada ou saída. Mas as opções anteriores são mais simples.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts