Как я могу определить, была ли консоль Windows запущена с / u переключателем перенаправления Unicode? - PullRequest
0 голосов
/ 18 февраля 2011

В Windows NT консоль Windows может обрабатывать Unicode, но по умолчанию, когда вывод перенаправляется из команды в файл, он преобразуется в текущую кодовую страницу ANSI, что означает, что любые символы вне кодовой страницы будут преобразованы в "?"символов.

Это можно исправить, запустив консоль с переключателем /u.

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

Ответы [ 3 ]

1 голос
/ 18 февраля 2011

Вот документация для ключа / U:

/ U Вызывает вывод внутренних команд в канал или файл в Unicode

Кажется довольно ясным, что этот параметр влияет только на поведение команд, интерпретируемых самим cmd.exe. Внутренне это, вероятно, просто устанавливает некоторый флаг. Нет способа прочитать это значение из внешнего процесса.

Я думаю, что вам лучше всего попытаться получить командную строку запускающего экземпляра cmd.exe. Это не рекомендуемая практика, но она должна быть безопасной в вашем случае. Вот статья, которая объясняет, как, но, пожалуйста, убедитесь, что вы понимаете предостережения.

Как получить командную строку другого процесса?

Вы можете использовать GetConsoleProcessList (), чтобы найти процесс размещения cmd.exe.

1 голос
/ 27 февраля 2011

Опция /u контролирует поведение интерпретатора команд и не имеет ничего общего с консолью. Этот вопрос, да и некоторые из комментариев к нему, делают классическую ошибку, сделанную много раз ранее, - совмещение консоли с интерпретатором команд , который, как оказалось, один процессов с использованием этой консоли. Интерпретатор команд не является консолью . Опции, позволяющие интерпретатору команд (или любой другой программе) записывать свой вывод определенными способами, не имеют ничего общего с консолью, на которую этот вывод может или не может быть направлен.

Действительно, эти параметры даже не связаны с консолью. Опции /U и /A для CMD переворачивают внутренний переключатель внутри самого интерпретатора команд, который проверяется встроенными командами, такими как DIR, перед тем как записывать в каналы и в файлы, Состояние переключателя определяет способ записи выходных данных. Можно даже увидеть эту опцию в исходном коде для Reactos CMD. Переключатель bUnicodeOutput и проверяется функцией ConWrite().

И это, конечно, указывает на то, как это делается в собственной программе для достижения того же эффекта. Каждый дает программным опциям /U и /A (или иным именем), соответственно переключает переключатель и изменяет поведение записи своей программы, когда обнаруживает, что записывает в канал или файл. Другими словами: каждый делает именно то, что делает CMD. И пользователь запускает свою программу, передавая ей параметры /U и /A, так же, как они делают, когда используют CMD.

Другими словами: пример этого механизма уже существует. Просто скопируйте его.

1 голос
/ 18 февраля 2011

Насколько я знаю, нет API, который вы можете использовать для запроса этого.

Чтобы обнаружить его, я бы предложил CreateFile на CONOUT$, написать несколько символов Юникода, которых нет в одной и той же кодовой странице (например, на японском, китайском, греческом), а затем прочитать консоль, используя ReadConsoleOutputCharacter ищет действительный юникод или мусор. А затем очистите вывод (возможно, сначала скопируйте его, потом восстановите).

Это своего рода клочок, и я не реализовал его для тестирования, но теория утверждает, что он должен работать.

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