В 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 пытается быть слишком умным в этом экземпляре.