В VC ++ 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.
Я не могу найти способ заставить VC ++ 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 при компиляции исходного файла. не меняйте строковые литералы, используйте их как байты за байтами.
Обновление
Спасибо за предложения, но я хочу избежать wchar. Поскольку это приложение имеет дело только со строками в UTF-8, использование wchar потребует от меня преобразования всех строк обратно в UTF-8, что не нужно. Все входные, выходные и внутренние обработки в UTF-8. Это простое приложение, которое отлично работает как в Linux, так и при компиляции с VC2003. Я хочу иметь возможность скомпилировать то же самое приложение с VC2008 и заставить его работать.
Чтобы это произошло, мне нужен VC2008, чтобы не пытаться преобразовать его в локаль моей локальной машины (японский, 932). Я хочу, чтобы VC2008 был обратно совместим с VC2003. Я хочу, чтобы настройка локали или компилятора гласила, что строки используются как есть, по существу как непрозрачные массивы char или как UTF-8. Похоже, я застрял с VC2003 и gcc, хотя VC2008 в этом случае пытается быть слишком умным.