Как изменить кодировку stdin и stdout на Python 2 - PullRequest
17 голосов
/ 29 апреля 2010

Я использую машины Windows и Linux для одного проекта. Кодировка по умолчанию для stdin в Windows - cp1252, а в Linux - utf-8.

Я бы хотел изменить все на utf-8. Является ли это возможным? Как я могу это сделать?

Этот вопрос о Python 2; для Python 3 см. Python 3: Как указать кодировку стандартного ввода

Ответы [ 4 ]

18 голосов
/ 29 апреля 2010

Вы можете сделать это, не полагаясь на неявную кодировку при печати. Не полагаться на это - хорошая идея в любом случае - неявное кодирование используется только при печати на стандартный вывод и когда стандартный вывод подключен к терминалу.

Лучше всего использовать unicode везде и codecs.open или codecs.getwriter везде. Вы помещаете sys.stdout в объект, который автоматически кодирует ваши строки Unicode в UTF-8, используя, например:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

Это будет работать, только если вы везде используете юникод. Поэтому везде используйте юникод. Действительно, везде.

17 голосов
/ 11 декабря 2014

Это старый вопрос, но только для справки.

Чтобы прочитать UTF-8 из stdin, используйте:

UTF8Reader = codecs.getreader('utf8')
sys.stdin = UTF8Reader(sys.stdin)

# Then, e.g.:
for _ in sys.stdin:
    print _.strip()

Для записи UTF-8 в stdout используйте:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

# Then, e.g.:
print 'Anything'
8 голосов
/ 06 февраля 2016

Python автоматически определяет кодировку стандартного ввода. Самый простой способ указать кодировку, когда автоматическое определение не работает должным образом, - это использовать переменную окружения PYTHONIOENCODING , как в следующем примере:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py

Дополнительную информацию об обнаружении кодировки и этой переменной на разных платформах вы можете найти в документации sys.stdin .

0 голосов
/ 29 января 2019

В Python 3.7 и новее вы можете использовать sys.stdin.reconfigure(encoding='utf-8')

см

py2: https://stackoverflow.com/a/4546129/7721525

* * 1008 PY3 1010 **
...