Подтвердить что ты не робот

О параметре "Набор символов" в Visual Studio

У меня есть запрос по поводу опции "Набор символов" в Visual Studio. Параметры набора символов:

  • Не установлено
  • Использовать набор символов Юникода
  • Использовать многобайтовый набор символов

Я хочу знать, в чем разница между тремя вариантами в наборе символов?

Также, если я выберу что-то из них, повлияет ли поддержка на другие языки, кроме английского (например, на языки RTL)?

4b9b3361

Ответ 1

Это параметр совместимости, предназначенный для устаревшего кода, который был написан для старых версий Windows, которые не были включены в Unicode. Версии семейства Windows 9x, Windows ME были последними и широко игнорируемыми. Если выбрано "Не задано" или "Использовать набор символов с несколькими байтами", все функции Windows API, которые принимают строку в качестве аргумента, переопределяются в небольшую вспомогательную функцию совместимости, которая преобразует строки char* в строки wchar_t*, родной API тип строки.

Такой код критически зависит от настройки кодовой страницы по умолчанию. На кодовой странице отображаются 8-битные символы в Unicode, который выбирает глиф шрифта. Ваша программа будет производить только правильный текст, если машина, на которой работает ваш код, имеет правильную кодовую страницу. Символы, значение которых >= 128 будет отображаться неправильно, если кодовая страница не соответствует.

Всегда выбирайте "Использовать набор символов Юникода" для современного кода. Особенно, если вы хотите поддерживать языки с раскладкой справа налево, и у вас нет кодовой страницы на арабском или иврите, выбранной на вашей машине dev. Используйте std::wstring или wchar_t[] в своем коде. Получение фактического макета RTL требует включения флага стиля WS_EX_RTLREADING в вызове CreateWindowEx().

Ответ 2

Ганс уже ответил на вопрос, но я обнаружил, что эти настройки имеют любопытные имена. (Что именно не устанавливается, и почему два других параметра звучат так одинаково?) В связи с этим:

  • "Unicode" здесь, в частности, говорит Microsoft для кодировки UCS-2. Это рекомендуемое и не зависящее от кодовой страницы, описанное Гансом. Соответствующий флаг C++ #define называется _UNICODE.
  • "Многобайтовый набор символов" (он же MBCS) здесь официальная фраза Microsoft для описания их прежней международной схемы кодирования текста. Как описал Ганс, существуют разные кодовые страницы MBCS, описывающие разные языки. Кодировки являются "многобайтовыми" в том смысле, что некоторые или все символы могут быть представлены несколькими байтами. (Некоторые кодовые страницы используют кодировку переменной длины, похожую на UTF-8.) Ваша типичная кодовая страница будет по-прежнему представлять все символы ASCII в виде однобайтовых символов. Соответствующий флаг C++ #define называется _MBCS
  • ."Не установлено", по-видимому, относится к компиляции с_UNICODE, а _MBCS #defined. В этом случае Windows работает со строгой однобайтовой кодировкой символов. (Еще раз, в этом случае доступно несколько разных кодовых страниц.)

Различия между MBCS и UTF-8 в Windows более подробно рассматриваются в этих вопросах.