Кажется, что окно консоли 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 ++.