Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Problema no uso da Biblioteca "locale.h"

Olá, senhores!

Venho aqui novamente para pedir-lhes ajuda em um problema que eu estou tendo no meu programa. Seguinte, estou querendo utilizar a biblioteca "locale.h" para poder imprimir as strings com acentuação. Então eu implementei a mesma no meu código e para a minha surpresa (ou não), ela não funcionou, continuou imprimindo no padrão C. Criei um pequeno código exemplificando a maneira que eu fiz para implementar a biblioteca e sua funcionalidade no meu programa original:

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

int main(void)
{
    printf("antes da localização\n");
    setlocale(LC_ALL, "Portuguese");
    //setlocale(LC_ALL, "");
    printf("localização atual: %s\n", setlocale(LC_ALL, "Portuguese"));
    printf("depois da localização\n");
    return EXIT_SUCCESS;
}

Saída:

antes da localização
localização atual: Portuguese_Brazil.1252
depois da localização

Como vocês podem ver, a função está implementando o idioma "Portuguese_Brazil" mas mesmo assim o comportamento de impressão permanece o mesmo. Se alguém puder me explicar o motivo disso estar acontecendo ou apontar aonde estou errando, ficaria muito agradecido!

OBS: Na função setlocale(), eu testei tanto o argumento "Portuguese" como "" e ambos deram o mesmo resultado.

5 respostas

Olá Eduardo, tudo bem ? Espero que sim.

Verifique se a solução desse tópico resolve a sua situação.

Bons Estudos, abraço.

Olá, Igor, estou bem sim, e você?

Dei uma olhada no tópico e talvez ele poderia resolver o meu problema, se a solução fosse implementada no meu código... O que o colega fez foi utilizar o comando "chcp 65001" para mudar a codificação da página do prompt de comando de "OEM - Multilingual Latin I" para "UTF-8". Para a minha necessidade, isso representa dois problemas: 1- Essa pratica acaba com a ideia de portabilidade que eu busco no meu programa. 2- Eu não quero uma alteração permanente na codificação do prompt de comando, entende?

Corri atrás de alguma forma de implementar a codificação TF-8 no próprio programa em C e o mais perto disso que eu consegui chegar foi oque eu achei nesse post aqui. Uma das ultimas respostas faz menção à uma biblioteca chamada "wchar.h". Aparentemente, segundo a sua documentação, ela possui utilitários para manipulação de caracteres multibytes (caracteres maiores que 127 na tabela ascii), mas infelizmente eu não consegui entender o suficiente para conseguir utiliza-la. Se você puder me dar uma ajuda nela ou conhecer alguma outra solução (de preferencia, algo que não envolva trocar a codificação manualmente rsrs), seria de grande ajuda!

solução!

Olá Eduardo, estou bem também.

Outro caminho que pensei foi salvar o nosso código fonte na codificação padrão do cmd. No meu caso a codificação é a 850:

print do cmd rodando o comando chcp e exibindo a codificação 850

Depois utilizei o VS Code para mudar as codificação do meu arquivo.

print mostrando codificação atual do arquivo que fica na parte inferior esquerda

Depois de clicar na codificação atual, conseguimos selecionar entre abrir o arquivo em outra codificação ou salvar em outra codificação, cliquei na de salvar:

print mostrando as opções descritas acima que aparecem na parte superior central

Agora escolho a codificação 850:

print mostrando as opções descritas acima que aparecem na parte superior central

Finalmente podemos recompilar o código e deve funcionar.

print mostrando as opções descritas acima que aparecem na parte superior central

Obs: Ainda não está claro pra mim, mas agora o setlocale está "atrapalhando".

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    printf("antes da localização\n");
    //setlocale(LC_ALL, "Portuguese");
    //setlocale(LC_ALL, "");
    printf("localização atual: \n");
    printf("depois da localização\n");
    return EXIT_SUCCESS;
}

Veja se essa solução resolve e serve ao seu proposito.

Bons Estudos, abraço.

Outra solução não tão "elegante" seria mudar a codificação do cmd no inicio do seu código através do system:

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    system("chcp 65001");
    system("cls");
    printf("antes da localização\n");
    setlocale(LC_ALL, "Portuguese");
    //setlocale(LC_ALL, "");
    printf("localização atual: %s\n", setlocale(LC_ALL, "Portuguese"));
    printf("depois da localização\n");
    return EXIT_SUCCESS;

}

Olá novamente, Igor!

Engraçado, a 3 dias atrás eu nem sabia como realizar o meu objetivo, agora eu tenho 3 formas diferentes de faze-lo.. rsrsrs

Desculpe a demora para responder os posts, é que eu ando ocupado ultimamente. Em relação às soluções que você encontrou, gostei bastante da solução do VScode, ela é bem simples e eficiente, no entanto, eu acabei optando pelo caminho da biblioteca wchar.h mesmo, pois ela me parece ser uma solução mais portável e além disso, a biblioteca oferece muitas opções para a manipulação desses caracteres especiais, então caso no futuro eu queira me aprofundar mais nisso, eu acredito que ela vai ser bastante útil e oque eu não consegui fazer sozinho, bastou alguns vídeos no youtube para me dar uma luz a respeito do funcionamento desse arquivo de cabeçalho... Enfim, eu já posso fechar essa discussão pois consegui solucionar o meu problema. Muito obrigado, Igor, sua ajuda foi muito importante para mim!