Конечно, это не очень хорошее название, но, честно говоря, я не был уверен, как сформулировать вопрос, не публикуя эссе в качестве вопроса. Это описание должно добавить немного плоти.
Проблема:
У меня есть скрипт 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
), но это не дало никаких результатов.
Итак, я в полном замешательстве.