Как изменить кодировку 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.
Ответ 4
В Python 3.7 и новее вы можете использовать sys.stdin.reconfigure(encoding='utf-8')
обращаться
py2: fooobar.com/questions/11820/...
py3: fooobar.com/questions/112558/...
Ответ 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)