Спецификация исходной кодировки charset в MSVC++, например, gcc "-finput-charset=CharSet"
Я хочу создать несколько примеров программ, которые работают с кодировками, в частности, я хочу использовать широкие строки, такие как:
wstring a=L"grüßen";
wstring b=L"שלום עולם!";
wstring c=L"中文";
Потому что это примеры программ.
Это абсолютно тривиально для gcc, который рассматривает исходный код как текст в кодировке UTF-8. Но простая компиляция не работает под MSVC. Я знаю, что могу кодировать их, используя escape-последовательности, но я бы предпочел сохранить их как читаемый текст.
Есть ли какая-либо опция, которую я могу указать в качестве переключателя командной строки для "cl", чтобы сделать эту работу? Там есть какой-то переключатель командной строки вроде gcc'c -finput-charset
Спасибо,
Если нет, то как бы вы предложили сделать текст естественным для пользователя?
Примечание: добавление спецификации в файл UTF-8 не вариант, потому что он становится не компилируемым другими компиляторами.
Примечание 2: мне нужно, чтобы оно работало в версии MSVC>= 9 == VS 2008
Реальный ответ: нет решения
5 ответов
Для тех, кто подписывается под девизом "лучше поздно, чем никогда", Visual Studio 2015 (версия 19 компилятора) теперь поддерживает это.
Новый /source-charset
переключатель командной строки позволяет указать кодировку набора символов, используемую для интерпретации исходных файлов. Он принимает один параметр, который может быть именем набора символов IANA или ISO:
/source-charset:utf-8
или десятичный идентификатор конкретной кодовой страницы (с предшествующей точкой):
/source-charset:.65001
Официальная документация находится здесь, а также есть подробная статья, описывающая эти новые опции в блоге команды Visual C++.
Существует также дополнительный /execution-charset
переключатель, который работает точно так же, но управляет тем, как узкие символьные и строковые литералы генерируются в исполняемом файле. Наконец, есть ярлык, /utf-8
, который устанавливает оба /source-charset:utf-8
а также /execution-charset:utf-8
,
Эти параметры командной строки несовместимы со старыми #pragma setlocale
а также #pragma execution-character-set
директивы, и они применяются глобально ко всем исходным файлам.
Для пользователей, использующих более старые версии компилятора, лучшим вариантом по-прежнему является сохранение исходных файлов в формате UTF-8 с спецификацией (как предлагали другие ответы, в среде IDE это можно сделать при сохранении). Компилятор автоматически обнаружит это и будет вести себя соответствующим образом. Так же будет и GCC, который также принимает спецификацию в начале исходных файлов, не задыхаясь до смерти, что делает этот подход функционально переносимым.
Открыто File->Advances Save Options...
Выбрать Unicode(UTF-8 with signature) - Codepage 65001
в кодировке комбо. Компилятор будет использовать выбранную кодировку автоматически.
По словам Microsoft ответ здесь:
если вам нужны не-ASCII символы, то "официальный" и переносимый способ их получения - использовать шестнадцатеричное кодирование \u (или \U) (которое, я согласен, просто безобразно и подвержено ошибкам).
Компилятор, когда сталкивается с исходным файлом, у которого нет спецификации, компилятор считывает вперед на определенное расстояние в файл, чтобы увидеть, может ли он обнаружить какие-либо символы Unicode - он специально ищет UTF-16 и UTF-16BE - если он не ' либо найти то, что предполагает MBCS. Я подозреваю, что в этом случае, что в этом случае возвращается к MBCS, и это является причиной проблемы.
Быть явным действительно лучше, и, хотя я знаю, что это не идеальное решение, я бы предложил использовать спецификацию.
Джонатан Пещеры
Команда разработчиков Visual C++.
Хорошим решением будет размещение текстовых строк в файлах ресурсов. Это удобный и портативный способ. Вы можете использовать библиотеки локализации, такие как gettext, для управления переводами.
Поток, который мы использовали: сохранить файлы как UTF8 с BOM, совместно использовать один и тот же источник между linux и windows, для linux: предварительно обработать исходные файлы в команде компиляции, чтобы удалить BOM, запустить g++ для промежуточного файла не-BOM.
Для VS вы можете использовать:
#pragma setlocale( "[locale-string]" )
Кодовая страница ANSI по умолчанию для локали будет использоваться в качестве кодировки файла.
Но в целом плохая идея жестко кодировать любые видимые пользователем строки в вашем коде. Храните их в каких-то ресурсах. Хорошо подходит для локализации, простой проверки правописания и обновления и т. Д.
ИМХО все исходные файлы C++ должны быть в строгом ASCII. Комментарии могут быть в UTF-8, если редактор поддерживает это.
Это делает код переносимым между платформами, редакторами и системами контроля версий.
Ты можешь использовать \u
вставить символы Юникода в широкую строку:
std::wstring str = L"\u20AC123,00"; //€123,00