Установить набор символов для компилятора Visual С++

Можно ли установить набор символов выполнения для компилятора Visual С++?

Проблема

При попытке конвертировать строковый литерал (UCN) в широкую строку, сбой выполнения во время выполнения при использовании Visual Studio 2015 для компиляции:

std::string narrowUCN = "\u00E4\u00F6\u00FC\u00DF\u20AC\u0040";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convertWindows;
std::wstring wide = convertWindows.from_bytes(narrowUCN); // Unhandled C++ exception in xlocbuf, line 426.

Использование narrowUCN = u8"\u00E4\u00F6\u00FC\u00DF\u20AC\u0040" работает, поэтому я предполагаю проблему с набором символов выполнения?

Ответ 1

Начиная с версии Visual Studio 2015 Update 2, можно установить набор символов выполнения в UTF-8, используя опцию компилятора /utf-8, Тогда будет работать преобразование узких строковых литералов, которые не используют u8. Это связано с тем, что эти строковые литералы затем преобразуются в UTF-8 вместо системной кодовой страницы (что является поведением Visual С++ компилятора по умолчанию).

Опция /utf-8 является синонимом для /source-charset:utf-8 и /execution-charset:utf-8. По ссылке выше:

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

Использование/execute-charset или /utf -8 может помочь при настройке кода между Linux и Windows, поскольку Linux обычно использует BOM-less файлы UTF-8 и набор символов выполнения UTF-8.

PS: Не путайте это с настройкой набора символов на странице общей конфигурации проекта, которая устанавливает только макросы Unicode/MBCS (исторические причины).