Como imprimir seqüências de caracteres UTF-8 em std :: cout no Windows?
Estou escrevendo um aplicativo de plataforma cruzada em C ++. Todas as strings são codificadas em UTF-8 internamente. Considere o seguinte código simplificado:
#include <string>
#include <iostream>
int main() {
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
return 0;
}
Em sistemas Unix,std::cout
espera que cadeias de caracteres de 8 bits sejam codificadas em UTF-8, portanto esse código funciona bem.
No Windows, no entanto,std::cout
espera que as seqüências de 8 bits estejam no formato Latin-1 ou em um formato não-Unicode semelhante (dependendo da página de código). Isso leva à seguinte saída:
Grego: ╬▒╬▓╬│╬┤; Alemão: ├ £ bergr├ƒentr├ñger
O que posso fazer para fazerstd::cout
interpretar cadeias de caracteres de 8 bits como UTF-8 no Windows?
Isto é o que eu tentei:
#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U8TEXT);
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
return 0;
}
Eu estava esperando que_setmode
faria o truque. No entanto, isso resulta no seguinte erro de declaração na linha que chamaoperator<<
:
Biblioteca de Tempo de Execução do Microsoft Visual C ++
Falha na declaração de depuração!
Programa: d: \ visual studio 2015 \ Projetos \ utf8test \ Debug \ utf8test.exe Arquivo: minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fputc.cpp Linha: 47
Expressão: ((_Stream.is_string_backed ()) || (fn = _fileno (_Stream.public_stream ())), ((_textmode_safe (fn) == __crt_lowio_text_mode :: ansi) &&! _Tm_unicode_safe (fn))))
Para obter informações sobre como o seu programa pode causar uma falha de declaração, consulte a documentação do Visual C ++ em declarações.