¿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.

Respuestas a la pregunta(5)

Su respuesta a la pregunta