Имеет ли смысл использовать wchar_t/wmain в консольном приложении Windows C++?

Я пишу новое приложение командной строки на C++. Одной из платформ, которую мы поддерживаем, конечно же, является Windows.

Консоль Windows по умолчанию использует кодовые страницы OEM в зависимости от локали (например, на моей машине это CP437/DOS.Western). Я думаю, если бы это была кириллическая версия Windows, то это был бы CP866 и так далее. Эти кодовые страницы OEM содержат только 256 символов)

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

  1. В таком случае имеет ли смысл использовать в моем приложении типы wmain/wchar_t и wide char?
  2. Есть ли преимущество использования широких типов? Или есть серьезная проблема, если используется только char *?
  3. Когда используются широкие типы символов, какова кодировка аргументов командной строки и строк среды - (wchar_t * argv [] и wchar_t * envp []), я имею в виду. Преобразованы ли они в UTF-16 с помощью Windows CRT или остались нетронутыми?

Спасибо за ваш вклад.


person Kiran M N    schedule 03.03.2013    source источник


Ответы (1)


Вы, кажется, предполагаете, что Windows внутренне работает в указанной кодовой странице. Это не правда. Windows внутри работает в Unicode (UTF-16). Для устаревшего программного обеспечения, использующего char вместо wchar_t, ввод и вывод преобразуются в указанную кодовую страницу.

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

Это неправильно. Сопоставление нажатий клавиш с символами (Unicode) определяется раскладкой клавиатуры. Это совершенно не зависит от кодовой страницы. Например, вы можете использовать китайскую раскладку клавиатуры в системе, использующей кодовую страницу кириллицы.

  1. Использованиеwchar_t не только имеет смысл, но и является рекомендуемым способом.
  2. Да, есть преимущество: ваша программа может обрабатывать все символы, поддерживаемые Windows. Если вы используете char, вы не сможете обрабатывать символы, которых нет в текущей кодовой странице.
  3. Они не конвертируются — они остаются такими, какие они есть, а именно символами UTF-16.

К сожалению, сама командная строка является приложением «ANSI», поэтому она страдает от всех ограничений «ANSI», и это влияет на ваше приложение, если вы используете его из командной строки. Однако консольное приложение можно использовать и другими способами, без окна командной строки, и тогда оно сможет полностью поддерживать Unicode.

person oefe    schedule 10.03.2013
comment
@oofe, спасибо за ваши ответы. Однако до сих пор мало что неясно. 1. Командная строка Windows имеет кодовую страницу по умолчанию. Текущую активную кодовую страницу можно получить, выполнив команду chcp; и может быть изменен с помощью той же команды. Согласно вашему комментарию, это не имеет отношения к используемой в настоящее время раскладке клавиатуры. Тогда какое в этом значение? Не уверен, каково поведение в перекрестном сценарии: китайская раскладка kb и кодовая страница кириллицы. - person Kiran M N; 19.03.2013
comment
2. Для приложения с поддержкой Unicode при вызове из командной строки с аргументами аргументы командной строки преобразуются в UTF-16 Windows CRT и передаются в wmain() как wchar_t *argv[]. Это правильно? Это то, что я имел в виду в своем вопросе 3 выше. - person Kiran M N; 19.03.2013