В VC++ 2003 я мог бы просто сохранить исходный файл как UTF-8, и все строки были использованы как есть. Другими словами, следующий код будет печатать строки, как и на консоли. Если исходный файл был сохранен как UTF-8, то выход будет UTF-8.Как создать строковый литерал UTF-8 в Visual C++ 2008
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 при компиляции исходного файла. то есть не изменяйте строковые литералы, используйте их байт для байта, как они есть.
Update
Спасибо за предложения, но я хочу, чтобы избежать WCHAR. Поскольку это приложение имеет дело только с строками в UTF-8, использование wchar потребует от меня преобразовать все строки обратно в UTF-8, что не должно быть ненужным. Вся входная, выходная и внутренняя обработка находится в UTF-8. Это простое приложение, которое отлично работает как в Linux, так и при компиляции с VC2003. Я хочу, чтобы иметь возможность компилировать то же приложение с VC2008 и работать.
Для этого мне понадобится VC2008, чтобы не пытаться преобразовать его в локальную локальную машину (японский, 932). Я хочу, чтобы VC2008 был обратно совместим с VC2003. Я хочу установить языковой стандарт или компилятор, который говорит, что строки используются как есть, по существу, как непрозрачные массивы char, или как UTF-8. Похоже, я мог застрять в VC2003 и gcc, хотя VC2008 пытается быть слишком умным в этом случае.
См. Ответ на новые версии VS: http://stackoverflow.com/questions/19987448/is-there-an-easy-way-to-write-utf-8-octets-in-visual-studio – bames53
Я просто столкнулся с этой проблемой в VS 2012. Он закручивает мою кодировку UTF-8. Почему VS так сломан? Я думаю, что я просто поместил свои данные во внешний файл, где он не будет испорчен. Необходимость работать с багги-компилятором довольно раздражает. BTW, C++ 11 позволяет кодирование указываться как u8 "literal", но VS 2012 не поддерживает это, так что это не поможет. – Joe