Как создать строковый литерал UTF-8 в Visual C++ 2008

В VC ++ 2003, я мог просто сохранить исходный файл как UTF-8, и все строки были использованы как есть. Другими словами, следующий код распечатал бы строки, как к консоли. Если бы исходный файл был сохранен как UTF-8 затем, то вывод был бы UTF-8.

printf("Chinese (Traditional)");
printf("中国語 (繁体)");
printf("중국어 (번체)");
printf("Chinês (Tradicional)");

Я сохранил файл в формате UTF-8 с BOM UTF-8. Однако компиляция с VC2008 приводит к:

warning C4566: character represented by universal-character-name '\uC911' 
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D' 
cannot be represented in the current code page (932)
etc.

Символы, вызывающие эти предупреждения, повреждаются. Те, которые действительно соответствуют локали (в этом случае 932 = японский язык) преобразовываются в кодирование локали, т.е. Shift JIS.

Я не могу найти способ заставить VC ++ 2008 компилировать это для меня. Обратите внимание, что не имеет значения, какую локаль я использую в исходном файле. Кажется, нет локали, которая говорит, что "Я знаю то, что я делаю, не делайте % f$ ##ng изменяет мои строковые литералы". В частности, бесполезная псевдолокаль UTF-8 не работает.

#pragma setlocale(".65001") 
=> error C2175: '.65001' : invalid locale

Ни один не делает "C":

#pragma setlocale("C") 
=> see warnings above (in particular locale is still 932)

Кажется, что VC2008 вызывает все символы в указанное (или значение по умолчанию) локаль, и что локаль не может быть UTF-8. Я не хочу изменять файл для использования строк Escape как "\xbf\x11...", потому что тот же источник компилируется с помощью gcc, который может вполне счастливо иметь дело с файлами UTF-8.

Там какой-либо путь состоит в том, чтобы указать, что компиляция исходного файла должна оставить строковые литералы нетронутыми?

Для выяснения у этого по-другому какие флаги компиляции могут, я использую для определения обратной совместимости с VC2003 при компиляции исходного файла. т.е. не изменяйте строковые литералы, используйте их байт для байта как они.

Обновление

Спасибо за предложения, но я хочу избежать wchar. Начиная с этого приложения соглашения со строками в UTF-8 исключительно, с помощью wchar затем потребовали бы, чтобы я преобразовал все строки назад в UTF-8, который должен быть ненужным. Весь вход, вывод и внутренняя обработка находятся в UTF-8. Это - простое приложение, которое хорошо работает, как находится на Linux и при компиляции с VC2003. Я хочу смочь скомпилировать то же приложение с VC2008 и иметь его работа.

Чтобы это произошло, мне нужен VC2008, чтобы не попытаться преобразовать его в локаль моей локальной машины (японский язык, 932). Я хочу, чтобы VC2008 был обратно совместим с VC2003. Я хочу локаль или параметр компилятора, который говорит, что строки использованы как есть, по существу как непрозрачные массивы символа, или как UTF-8. Похоже, что я мог бы застрять с VC2003 и gcc, хотя, VC2008 пытается быть слишком умным в этом экземпляре.

61
задан 29 March 2009 в 07:29

0 ответов

Другие вопросы по тегам:

Похожие вопросы: