2009-04-06 1 views
3

Во время тестирования некоторых функций для преобразования строк между wchar_t и utf8 я встретил следующий странный результат с помощью Visual C++ 2008 ExpressНеожиданный вывод std :: wcout << L "élève"; В Windows Shell

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

распечатывает «ÚlÞve:», который, очевидно, не то, что, как ожидается.

Это, очевидно, ошибка. Как это может быть ? Как я предполагаю иметь дело с такой «особенностью»?

ответ

12

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

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

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

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

UPDATE:

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

+0

К сожалению, использование выходов кода Дэйва точно такой же вывод, , Итак, я думаю, это означает, что оболочка не поддерживает unicode. – chmike

+0

Кажется, что я должен активировать поддержку UTF-8 в оболочке, выпустив команду chcp 65001. Как я могу сделать это изнутри программы, прежде чем записывать вещи? – chmike

+0

Он не будет выводить полный UTF-16. Вам повезло, если вы получите выход ANSI, потому что байты верхнего порядка сбиты. Но символы совместимы с ANSI стр. 1252. –

1

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

0

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

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

1

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

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

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

Смежные вопросы