Спецификация кодировки исходного кода в MSVС++, например 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

Реальный ответ: Нет решения

Ответ 1

Для тех, кто подписывается на девиз "лучше поздно, чем никогда", Visual Studio 2015 (версия 19 компилятора) теперь поддерживает это.

Новый переключатель командной строки /source-charset позволяет вам указать кодировку набора символов, используемую для интерпретации исходных файлов. Он принимает один параметр, который может быть либо IANA, либо имя набора символов ISO:

/source-charset:utf-8

или десятичный идентификатор конкретной кодовой страницы (которой предшествует точка):

/source-charset:.65001

Официальная документация здесь, а также подробная статья описывая эти новые параметры в блоге команды Visual С++.

Существует также дополнительный /execution-charset switch, который работает точно так же, но контролирует, как генерируются узкие символы и строковые литералы в исполняемом файле. Наконец, есть переключатель быстрого доступа, /utf-8, который устанавливает как /source-charset:utf-8, так и /execution-charset:utf-8.

Эти параметры командной строки несовместимы со старыми директивами #pragma setlocale и #pragma execution-character-set, и они применяются глобально ко всем исходным файлам.

Для пользователей, придерживающихся более старых версий компилятора, лучший вариант - сохранить исходные файлы как UTF-8 с спецификацией (как предложили другие ответы, IDE может это сделать при сохранении). Компилятор автоматически обнаружит это и будет вести себя соответствующим образом. Так же будет GCC, который также принимает спецификацию в начале исходных файлов без удушения до смерти, делая этот подход функционально переносимым.

Ответ 2

Откройте File->Advances Save Options... Выберите Unicode(UTF-8 with signature) - Codepage 65001 в комбо-кодировке. Компилятор автоматически использует выбранную кодировку.

advancedsave.png


Согласно Microsoft ответьте здесь:

если вы хотите не-ASCII-символы, тогда "официальный" и переносимый способ получить их - использовать шестнадцатеричную кодировку \u (или\U) (которая, я согласна, просто уродливая и подверженная ошибкам).

Компилятор, столкнувшись с исходным файлом, который не имеет спецификации, компилятор читает впереди определенное расстояние в файле, чтобы увидеть, может ли он обнаруживать любые символы Юникода - он специально ищет UTF-16 и UTF-16BE - если он не находит ни то, значит он предполагает, что он имеет MBCS. Я подозреваю, что в этом случае он возвращается к MBCS, и это то, что вызывает проблему.

Быть явным - это действительно лучше, и поэтому, хотя я знаю, что это не идеальное решение , я бы предложил использовать спецификацию.

Пещеры Джонатана
Команда компилятора Visual С++.


Хорошее решение будет размещать текстовые строки в файлах ресурсов. Это удобно и переносимо. Для управления переводами можно использовать библиотеки локализации, такие как gettext.

Ответ 3

IMHO все исходные файлы С++ должны быть в строгом ASCII. Комментарии могут быть в UTF-8, если редактор поддерживает его.
Это делает код переносимым между платформами, редакторами и системами управления версиями.

Вы можете использовать \u для вставки символов Юникода в широкую строку:

std::wstring str = L"\u20AC123,00"; //€123,00

Ответ 4

Поток, который мы использовали: сохранение файлов как UTF8 - с помощью спецификации, общий ресурс между linux и windows, для linux: предварительная обработка исходных файлов в команде компиляции для удаления спецификации, запуск g++ на промежуточной не-спецификации файл.

Ответ 5

Для VS вы можете использовать:

#pragma setlocale( "[locale-string]" )

В качестве кодировки файла будет использоваться стандартная кодовая страница ANSI по умолчанию.

Но в целом это плохая идея, чтобы жестко закодировать любые видимые пользователем строки в коде. Храните их в каких-то ресурсах. Хорошо для локализации, простой проверки орфографии и обновления и т.д.