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.

questionAnswers(5)

yourAnswerToTheQuestion