Неожиданный вывод std :: wcout << L "élève"; в Windows Shell - PullRequest
3 голосов
/ 06 апреля 2009

При тестировании некоторых функций для преобразования строк между wchar_t и utf8 я встретил следующий странный результат с Visual C ++ express 2008

std::wcout << L"élève" << std::endl;

выводит ":lÞve:", что явно не то, что ожидается.

Это явно ошибка. Как это может быть ? Как я должен иметь дело с такой «функцией»?

Ответы [ 5 ]

12 голосов
/ 06 апреля 2009

Компилятор C ++ не поддерживает Unicode в файлах кода. Вместо этого вы должны заменить эти символы на их экранированные версии.

Попробуйте это:

std::wcout << L"\x00E9l\x00E8ve" << std::endl;

Кроме того, ваша консоль также должна поддерживать Unicode.

UPDATE:

Он не будет выдавать желаемый результат на вашей консоли, потому что консоль не поддерживает Unicode.

2 голосов
1 голос
/ 21 августа 2010

Это явно ошибка. Как это может быть?

В то время как другие операционные системы отказались от устаревших кодировок символов и переключились на UTF-8, Windows использует два устаревших кодировки: кодовую страницу «OEM» (используется в командной строке) и «ANSI» кодовая страница (используется GUI).

Ваш исходный файл C ++ находится в кодовой странице ANSI 1252 (или, возможно, 1254, 1256 или 1258), но ваша консоль интерпретирует его как кодовую страницу OEM 850.

1 голос
/ 06 апреля 2009

Возможно, вы также захотите взглянуть на этот вопрос . В нем показано, как можно на самом деле жестко кодировать символы юникода в файлы с помощью некоторых компиляторов (я не уверен, какие параметры будут получены в MSVC).

0 голосов
/ 11 ноября 2009

Вы IDE и компилятор используете кодовую страницу ANSI. Консоль использует кодовую страницу OEM.

Также важно, что вы делаете с этими функциями преобразования.

...