¿Cómo imprimir cadenas UTF-8 en std :: cout en Windows?
Estoy escribiendo una aplicación multiplataforma en C ++. Todas las cadenas tienen codificación UTF-8 internamente. Considere el siguiente código simplificado:
#include <string>
#include <iostream>
int main() {
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
return 0;
}
En sistemas Unix,std::cout
espera que las cadenas de 8 bits estén codificadas en UTF-8, por lo que este código funciona bien.
En Windows, sin embargo,std::cout
espera que las cadenas de 8 bits estén en Latin-1 o en un formato similar que no sea Unicode (dependiendo de la página de códigos). Esto lleva a la siguiente salida:
Griego: ╬▒╬▓╬│╬┤; Alemán: ber £ bergr├Â├ƒentr├ñger
¿Qué puedo hacer para hacerstd::cout
interpretar cadenas de 8 bits como UTF-8 en Windows?
Esto es lo que probé:
#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;
}
Esperaba que_setmode
Haría el truco. Sin embargo, esto da como resultado el siguiente error de aserción en la línea que llamaoperator<<
:
Biblioteca de tiempo de ejecución de Microsoft Visual C ++
¡Depuración de aserción!
Programa: d: \ visual studio 2015 \ Projects \ utf8test \ Debug \ utf8test.exe Archivo: minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fputc.cpp Línea: 47
Expresión: ((_Stream.is_string_backed ()) || (fn = _fileno (_Stream.public_stream ()), ((_textmode_safe (fn) == __crt_lowio_text_mode :: ansi) &&! _Tm_unicode_safe (fn))))
Para obtener información sobre cómo su programa puede causar un error de aserción, consulte la documentación de Visual C ++ en afirmaciones.