Спецификация исходной кодировки charset в MSVC ++, например, gcc "-finput-charset = CharSet" - PullRequest
15 голосов
/ 02 ноября 2009

Я хочу создать несколько примеров программ, которые работают с кодировками, особенно я хочу использовать широкие строки, такие как:

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 ]

11 голосов
/ 10 июня 2016

Для тех, кто подписывается под девизом «лучше поздно, чем никогда», 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, который также принимает спецификацию в начале исходных файлов, не задыхаясь до смерти, делая этот подход функционально переносимым.

6 голосов
/ 02 ноября 2009

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

image


According to Microsoft answer здесь

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

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

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

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


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

2 голосов
/ 12 июня 2012

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

1 голос
/ 12 ноября 2009

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

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

std::wstring str = L"\u20AC123,00"; //€123,00
1 голос
/ 11 ноября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...