Спецификация исходной кодировки 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
Другие вопросы по тегам