В чем разница между перенаправлением и кодировкой текста в Windows CMD и PowerShell?

В чем разница между перенаправлением и кодировкой текста в Windows CMD и PowerShell?

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

Проблема:

У меня есть скрипт Python (написанный не мной), который я запускаю в Windows с помощью Python 2.7. Он относительно прост и извлекает информацию из различных источников и выводит вывод на терминал. Часть этого вывода использует символы в не-ASCII наборе символов, и вот тут-то и началось веселье.

Хотя скрипт Python работал нормально в терминале, печатая на экране, как только я добавил перенаправление файла, я получил ошибку, и скрипт Python завис. После МНОГО исследований, похоже, что это сводится к тому, как Python 2.7 обрабатывает Unicode, и я обошел это, установив переменную среды Windows для Python. Это было:

$env:PYTHONIOENCODING="UTF-8"

в PowerShell и

Set PYTHONIOENCODING="UTF-8"

в КМД.

Хорошо, теперь вывод скрипта Python можно перенаправить в файл без сбоя. Проблема в том, что эти две среды дают разные результаты. Базовый формат для запуска скрипта Python:

python pythonscript.py parm1 > test.txt

Хотя это работает и в CMD, и в PowerShell, в итоге я получаю файл с разными кодировками и символами. Например, символ, вызывающий проблемы, — это ø. Если я запускаю указанную выше строку в CMD, полученный файл кодируется как UTF-8и правильно отображает этот символ. В PowerShell выполнение той же команды приводит к созданию файла, закодированного как UCS-2 LE BOM(как показано в NotePad++), а указанный выше символ на самом деле отображается как 2 символа ├©.

Что еще более странно, если я не перенаправляю ни в одну из сред (просто печатаю на терминале), то в обеих средах отображаются неправильные символы.

Я также попробовал в PowerShell выполнить конвейеризацию в Out-file CmdLet, вот так:

python pythonscript.py parm1 | out-file -encoding UTF8 test.txt

Это приводит к файлу, закодированному как UTF-8-BOM, но все еще появляются неправильные символы. Я пробовал разные типы кодировок, и хотя я в итоге получил разные кодировки файлов и разные символы, ничего не кажется правильным.

Я также посмотрел на кодовую страницу обеих сред, запустив chcp. В обоих случаях это возвращает Active code page: 850. Я пытался установить PowerShell на кодовую страницу 65001(которая является utf-8), но это не дало никаких результатов.

Итак, я в полном замешательстве.

Связанный контент