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

Проблема:

У меня есть скрипт 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), и это ничего не изменило.

Итак, я полностью сбит с толку.

0