Кажется, что окно консоли Windows не очень хорошо поддерживает Unicode, я предлагаю вам использовать MessageBox.

у кроссплатформенное приложение на C ++. Все строки имеют внутреннюю кодировку UTF-8. Рассмотрим следующий упрощенный код:

#include <string>
#include <iostream>

int main() {
    std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
    std::cout << test;

    return 0;
}

В системах Unix,std::cout ожидает, что 8-битные строки будут в кодировке UTF-8, поэтому этот код работает нормально.

В Windows, однако,std::cout ожидает, что 8-битные строки будут в формате Latin-1 или аналогичном формате, отличном от Unicode (в зависимости от кодовой страницы). Это приводит к следующему выводу:

Греческий: ╬▒╬▓╬│╬┤; Немецкий: ├ £ bergr├Â├ƒentr├ñger

Что я могу сделать, чтобы сделатьstd::cout интерпретировать 8-битные строки как UTF-8 в Windows?

Вот что я попробовал:

#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;
}

Я надеялся что_setmode сделал бы трюк. Однако это приводит к следующей ошибке подтверждения в строке, которая вызываетoperator<<:

Библиотека времени выполнения Microsoft Visual C ++

Ошибка отладки!

Программа: d: \ visual studio 2015 \ Projects \ utf8test \ Debug \ utf8test.exe Файл: minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fputc.cpp Строка: 47

Выражение: ((_Stream.is_string_backed ()) || (fn = _fileno (_Stream.public_stream ()), ((_textmode_safe (fn) == __crt_lowio_text_mode :: ansi) &&! _Tm_unicode_safe (fn))))

Для получения информации о том, как ваша программа может вызвать ошибку утверждения, см. Документацию по утверждениям в Visual C ++.

Ответы на вопрос(0)

Ваш ответ на вопрос