Как создать строковый литерал UTF-8 в Visual C++ 2008
в 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.
символы, вызывающие эти предупреждения были повреждены. Те, которые соответствуют локали (in этот случай 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-строки, такие как "xbfx11..."потому что один и тот же источник скомпилирован с использованием 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 пытается быть слишком умным в этом пример.
Comments