Неожиданный вывод std::wcout << L“élève”;в оболочке Windows
Вопрос
При тестировании некоторых функций для преобразования строк между wchar_t и utf8 я столкнулся со следующим странным результатом с Visual C ++ express 2008
std::wcout << L"élève" << std::endl;
выводит "UlÞve:", что явно не то, что ожидается.
Очевидно, что это ошибка.Как это может быть ?Как я предполагаю справиться с такой "особенностью" ?
Решение
Компилятор C ++ не поддерживает Unicode в файлах кода.Вместо этого вы должны заменить эти символы их экранированными версиями.
Попробуй это:
std::wcout << L"\x00E9l\x00E8ve" << std::endl;
Кроме того, ваша консоль также должна поддерживать Unicode.
Обновить:
Это не приведет к желаемому результату в вашей консоли, поскольку консоль не поддерживает Unicode.
Другие советы
Я нашел эти связанные вопросы с полезными ответами Существует ли командная оболочка Windows, которая будет отображать символы Юникода? Как я могу встроить строковые константы unicode в исходный файл?
Возможно, вы также захотите взглянуть на этот вопрос.Это показывает, как на самом деле вы можете жестко закодировать символы юникода в файлы, используя некоторые компиляторы (я не уверен, какие опции будут у MSVC).
Очевидно, что это ошибка.Как это может быть?
В то время как другие операционные системы отказались от устаревших кодировок символов и перешли на UTF-8, Windows использует два устаревшие кодировки:Кодовая страница "OEM" (используется в командной строке) и кодовая страница "ANSI" (используется графическим интерфейсом).
Ваш исходный файл C ++ находится на кодовой странице ANSI 1252 (или, возможно, 1254, 1256 или 1258), но ваша консоль интерпретирует его как кодовую страницу OEM 850.
Ваша IDE и компилятор используют кодовую страницу ANSI.Консоль использует кодовую страницу OEM-производителя.
Также имеет значение, что вы делаете с этими функциями преобразования.