без вывода широких символов в командную строку - PullRequest
0 голосов
/ 22 апреля 2011

Я пытаюсь записать следующий символ в командной строке Windows: ュ (U + FF6D).

Я могу видеть, как символ записывается с помощью WriteConsoleW.Я также могу видеть символ, если я использую WideCharToMultiByte, используя кодовую страницу CP_ACP (chcp возвращает 932: японский).Однако, когда я пытаюсь использовать обычный wcout для той же строки, которую успешно печатает WriteConsoleW, он задыхается.

Когда я выполняю setlocale (LC_ALL, ""), он печатает English_UnitedStates.1252 (кодовая страница по умолчанию, которая у меня былакогда я установил).

Почему wcout дает сбой, когда другие преуспевают?

Примечание. Я перезагрузил компьютер, чтобы изменить его системный язык на Японский Японский

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Язык по умолчанию для Cost iostreams всегда является языком "C". Из стандарта C ++ 03, §27.4.2.3 / 4:

locale getloc() const;

Если не было введено ни одной локали, копия глобальной локали C ++, locale(), действующей на момент создания.

Из §22.1.1.2 / 1-2:

locale() throw();

Конструктор по умолчанию: снимок текущего глобального языкового стандарта.

Создает копию последнего аргумента, переданного locale::global(locale&), если он был вызван; в противном случае результирующие фасеты имеют семантику виртуальных функций, идентичную locale::classic().

Из §22.1.1.5 / 4-6:

static const locale& classic();

Язык "C".

Возвращает: локаль, которая реализует классическую семантику локали "C", эквивалентную значению locale("C").

Примечания. Этот языковой стандарт, его фасеты и функции-члены не изменяются со временем.

Поскольку std::cout и std::wcout имеют статическую длительность хранения, они гарантированно будут инициализированы до вызова main и, следовательно, всегда будут иметь языковой стандарт "C" при запуске приложения; то есть, в начале выполнения нет смысла, что можно было бы вызвать locale::global и изменить локаль по умолчанию для std::cout и std::wcout. Таким образом, вы всегда должны наполнять глобальные потоки самостоятельно, если хотите использовать кодовую страницу не по умолчанию.

0 голосов
/ 22 апреля 2011

wcout создается до выполнения любого кода в main.К тому времени, когда вы звоните setlocale, wcout уже там, готов сделать свое дело.Он не пытается отслеживать последующие изменения, которые вы можете внести с помощью setlocale, поэтому он продолжает использовать значение по умолчанию вместо того, что вы установили с помощью setlocale.

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