Как правильно перенаправить вывод Unicode и ANSI на cmd.exe? - PullRequest
8 голосов
/ 25 апреля 2010

Если вы выполняете автоматизацию в Windows и перенаправляете вывод различных команд (внутренних cmd.exe или внешних), вы обнаружите, что ваши файлы журналов содержат комбинированные выходные данные Unicode и ANSI (это означает, что они недопустимы и не будут хорошо загружаться в средствах просмотра / редактирования).

Можно ли заставить cmd.exe работать с UTF-8? Этот вопрос не об отображении, а о перенаправлении stdin / stdout / stderr и Unicode.

Я ищу решение, которое позволило бы вам:

  • перенаправить вывод внутренних команд в файл, используя UTF-8
  • перенаправить вывод внешних команд, поддерживающих Unicode, в файлы, но закодированные как UTF-8.

Если невозможно получить такой вид консистенции с помощью пакетных файлов, есть ли другой способ решения этой проблемы, например использование сценариев Python для этого? В этом случае я хотел бы знать, возможно ли выполнить обнаружение Unicode в одиночку (пользователь, использующий сценарии, не должен помнить, будут ли вызываемые инструменты выводить Unicode или нет, он просто ожидает преобразования вывода в UTF-8.

Для простоты мы будем предполагать, что если выход инструмента не-Unicode, он будет рассматриваться как UTF-8 (без преобразования кодовой страницы).

Ответы [ 2 ]

8 голосов
/ 25 апреля 2010

Вы можете использовать chcp для изменения активной кодовой страницы. Это также будет использоваться для перенаправления текста:

chcp 65001

Имейте в виду, однако, что это не будет иметь эффекта, если cmd был запущен с переключателем /u, который вызывает вывод перенаправления Unicode (в данном случае UTF-16). Если этот переключатель активен, то все выходные данные будут в формате UTF-16LE, независимо от кодовой страницы, установленной с помощью chcp.

Также обратите внимание, что консоль будет непригодна для интерактивного вывода, если задано значение Растровые шрифты. Я получаю забавные сообщения об ошибках в этом случае:

C:\Users\Johannes Rössel\Documents>x
Active code page: 65001

The system cannot write to the specified device.

Так что либо используйте правильную настройку (шрифт TrueType для консоли), либо не тяните этот трюк при интерактивном использовании консоли и наличии пути, который содержит символы не ASCII.

0 голосов
/ 04 июня 2013
binmode(STDOUT, ":unix");

без

use encoding 'utf8';

Помог мне. С этим у меня был широкий символ в предупреждении печати. ​​

...