[MINGW64/GCC] Alguma forma de fazer funcionar std::locale no Windows? [RESOLVIDO]

1. [MINGW64/GCC] Alguma forma de fazer funcionar std::locale no Windows? [RESOLVIDO]

M.
XProtoman

(usa Fedora)

Enviado em 24/05/2017 - 02:07h

Boa noite a todos,

Estava portando o código de uma biblioteca quando vi que não é possível instanciar std::locale sem que seja atribuído "C" ou "POSIX", gostaria de usar pt_BR se possível em UTF-8.

Exemplo de código válido no Linux:
#include <iostream>
#include <locale>

int main()
{
std::locale("pt_BR.UTF-8");
std::cout << std::cout.getloc().name() << std::endl;
return 0;
}


Erro apresentado ao executar no Wine:
$ wine w.exe 
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid

abnormal program termination


Código compilado no x86_64-w64-mingw32-g++


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/05/2017 - 09:14h

Nomes de locales são dependentes de cada sistema. Os dois únicos nomes que são universalmente aceitos são "C" (locale padrão) e "" (locale default de cada sistema).

Já tentou chamar apenas como "pt-BR"?

A respeito de UTF-8, a documentação de setlocale() na MSDN diz o seguinte:

The locale argument can take a locale name, a language string, a language string and country/region code, a code page, or a language string, country/region code, and code page. The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page value of UTF-7 or UTF-8, setlocale will fail, returning NULL. The set of locale names supported by setlocale are described in [[Locale Names, Languages, and Country/Region Strings]](https://msdn.microsoft.com/en-us/library/hzz3tw78.aspx). The set of language and country/region strings supported by setlocale are listed in [[Language Strings]](https://msdn.microsoft.com/en-us/library/39cwe7zf.aspx) and [[Country/Region Strings]](https://msdn.microsoft.com/en-us/library/cdax410z.aspx). We recommend the locale name form for performance and for maintainability of locale strings embedded in code or serialized to storage. The locale name strings are less likely to be changed by an operating system update than the language and country/region name form.


Uma leitura interessante (entre várias outras) que eu achei enquanto pesquisava para esta resposta foi a seguinte: http://utf8everywhere.org/.

3. Re: [MINGW64/GCC] Alguma forma de fazer funcionar std::locale no Windows?

M.
XProtoman

(usa Fedora)

Enviado em 24/05/2017 - 16:01h

Boa tarde Paulo,

Lendo o que você postou fiz isso:
std::cout << setlocale(LC_ALL, "") << std::endl; 


Ele me retornou o locale, acho que atual:
Portuguese_Brazil.1252 


Tentei usar esse locale no std::locale, mas infelizmente acho que nada dará certo nele.

Obrigado pela ajuda.

PS: Vou estudar u32string porque estou vendo que terei problemas com wstring no Windows.

____________________
“Mas nós sabemos que a razão de a maioria estar aqui, é a nossa afinidade com a desobediência!” (Morpheus)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts