Конечно, это не очень удачное название, но, честно говоря, я не был уверен, как сформулировать вопрос, не разместив эссе в качестве вопроса. Это описание должно добавить немного плоти.
Проблема:
У меня есть скрипт Python (не написанный мной), который я запускаю в Windows, используя Python 2.7. Это относительно базовое и извлекает информацию из различных источников и печатает вывод на терминал. Некоторые из этих выходных данных используют символы в наборе символов, отличном от ASCII, и именно здесь началось веселье.
В то время как скрипт Python работал нормально при печати терминала на экране, как только я добавил перенаправление файлов, я получил ошибку, и скрипт Python потерпел крах. После многих исследований это, похоже, сводилось к тому, как Python 2.7 обрабатывает Unicode, и я решил эту проблему, установив переменную среды Windows для Python. Это было:
$env:PYTHONIOENCODING="UTF-8"
в PowerShell и
Set PYTHONIOENCODING="UTF-8"
в CMD.
Итак, теперь вывод скрипта 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
), и это ничего не изменило.
Итак, я полностью сбит с толку.