Как изменить кодировку stdin и stdout на Python 2

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

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

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

Ответы

Ответ 1

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

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

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

Это будет работать, только если вы используете unicode везде. Итак, используйте unicode везде. Действительно, везде.

Ответ 2

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

Чтобы прочитать 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'

Ответ 3

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

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

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

Ответ 5

Я использовал простой фрагмент кода, который работает для меня в Ubuntu: python2.7 и python3.6

from sys import version_info
if version_info.major == 2:  # for python2
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout)
elif version_info.major == 3:  # for python3
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin.buffer)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout.buffer)