В VС++ 2003 я могу просто сохранить исходный файл как UTF-8, и все строки были использованы как есть. Другими словами, следующий код будет печатать строки, как и на консоли. Если исходный файл был сохранен как UTF-8, то результатом будет UTF-8.
printf("Chinese (Traditional)");
printf("中国語 (繁体)");
printf("중국어 (번체)");
printf("Chinês (Tradicional)");
Я сохранил файл в формате UTF-8 с помощью спецификации 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.
Я не могу найти способ заставить VС++ 2008 скомпилировать это для меня. Обратите внимание, что не имеет значения, какой язык я использую в исходном файле. Кажется, что не существует языкового стандарта, в котором говорится: "Я знаю, что делаю, поэтому не изменяйте строковые литералы". В частности, бесполезный псевдоязык 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 при компиляции исходного файла. то есть не изменяйте строковые литералы, используйте их для байта, как они есть.
Update
Спасибо за предложения, но я хочу избежать wchar. Поскольку это приложение имеет дело только с строками в UTF-8, использование wchar потребует от меня преобразовать все строки обратно в UTF-8, что не должно быть ненужным. Вся входная, выходная и внутренняя обработка находится в UTF-8. Это простое приложение, которое отлично работает как в Linux, так и при компиляции с VC2003. Я хочу, чтобы иметь возможность компилировать то же приложение с VC2008 и работать.
Чтобы это произошло, мне нужно, чтобы VC2008 не пытался преобразовать его в локальный локальный язык (японский, 932). Я хочу, чтобы VC2008 был обратно совместим с VC2003. Я хочу установить локаль или компилятор, который говорит, что строки используются как есть, по существу, как непрозрачные массивы char, или как UTF-8. Похоже, я мог застрять в VC2003 и gcc, хотя VC2008 пытается быть слишком умным в этом случае.