Консоль Windows, Python и кодировки — как оно работает?
Обратил внимание на то, что subprocess.getoutput('ping ya.ru') возвращает кракозябры вместо русского текста. Пошёл разбираться в какой кодировке работает консоль, консоль говорит что это cp866. Окей, в принципе если использовать subprocess.check_output('ping ya.ru'), то я получу ответ в байтах который можно представить в виде нормального текста через decode("cp866").
И вот вроде бы проблемы больше нет, но любопытство не отпускает, хотелось нормальный результат из subprocess.getoutput получить. Нагуглил рецепт в котором полученный string сначала кодируют в CP1251, а затем декодируют в CP866.
Но теперь я не понимаю почему этот рецепт работает. Зачем необходим вот этот промежуточный encode в CP1251? Нам же вроде как консоль cp866 возвращала. Я понимаю что перед decode нужно как-то string из ответа в bytes перевести, но почему тогда не работает encode('cp866').decode('cp866')?
Насколько я помню, там разница если выводить прямо на (интерактивную) консоль или редирект в файл или в PIPE (тогда ANSI). По крайней мере для самого Питона. Вот тут немного есть...