S0ulReaver
@S0ulReaver

Консоль Windows, Python и кодировки — как оно работает?

Обратил внимание на то, что subprocess.getoutput('ping ya.ru') возвращает кракозябры вместо русского текста. Пошёл разбираться в какой кодировке работает консоль, консоль говорит что это cp866. Окей, в принципе если использовать subprocess.check_output('ping ya.ru'), то я получу ответ в байтах который можно представить в виде нормального текста через decode("cp866").

И вот вроде бы проблемы больше нет, но любопытство не отпускает, хотелось нормальный результат из subprocess.getoutput получить. Нагуглил рецепт в котором полученный string сначала кодируют в CP1251, а затем декодируют в CP866.

subprocess.getoutput('ping ya.ru').encode('cp1251').decode('cp866')

Но теперь я не понимаю почему этот рецепт работает. Зачем необходим вот этот промежуточный encode в CP1251? Нам же вроде как консоль cp866 возвращала. Я понимаю что перед decode нужно как-то string из ответа в bytes перевести, но почему тогда не работает encode('cp866').decode('cp866')?
  • Вопрос задан
  • 697 просмотров
Пригласить эксперта
Ответы на вопрос 2
@belotooth
В докухе написано, что это легаси функция, может уже не стоит ее использовать.
Вот так нормально вроде работает:
subprocess.check_output('ping ya.ru', encoding='cp866')
Ответ написан
Комментировать
@Andy_U
Насколько я помню, там разница если выводить прямо на (интерактивную) консоль или редирект в файл или в PIPE (тогда ANSI). По крайней мере для самого Питона. Вот тут немного есть...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы