Nginx redis подключается к недоступному ведущему узлу

Как печатать кодированный текст UTF-8 в консоли в Python & lt; 3?

blockquote>
print u"some unicode text \N{EURO SIGN}"
print b"some utf-8 encoded bytestring \xe2\x82\xac".decode('utf-8')

, т. Е. Если у вас есть строка Unicode, тогда распечатайте ее напрямую. Если у вас есть bytestring, сначала конвертируйте его в Unicode.

Настройки вашей локали (LANG, LC_CTYPE) указывают язык utf-8, и поэтому (теоретически) вы можете напечатать utf-8 bytestring напрямую, и он должен отображаться правильно в вашем терминале (если параметры терминала соответствуют настройкам локали, и они должны быть), но вы должны избегать этого: не кодирует кодировку символов вашей среды внутри вашего скрипта ; печатать Unicode напрямую вместо .

В вашем вопросе много ошибочных предпосылок.

Вам не нужно устанавливать PYTHONIOENCODING с настройками вашей локали, чтобы напечатайте Unicode на терминал. utf-8 locale поддерживает все символы Unicode, т. е. работает как есть.

Вам не нужен обходной путь sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout). Он может сломаться, если какой-либо код (который вы не контролируете) нуждается в печати байтов и / или может сломаться, когда печатает Unicode на консоли Windows (неправильная кодовая страница, не может печатать недоказуемые символы) . Правильных настроек локали и / или PYTHONIOENCODING envvar достаточно. Кроме того, если вам нужно заменить sys.stdout, тогда использует io.TextIOWrapper() вместо модуля codecs , например win-unicode-console package .

sys.getdefaultencoding() не имеет отношения к вашим языковым настройкам и к PYTHONIOENCODING. Ваше предположение о неправильной настройке PYTHONIOENCODING sys.getdefaultencoding() неверно. Вы должны проверить sys.stdout.encoding.

sys.getdefaultencoding() не используется, когда вы печатаете на консоли. Он может использоваться как резерв на Python 2, если stdout перенаправляется на файл / трубу, если не установлен PYTHOHIOENCODING:

$ python2 -c'import sys; print(sys.stdout.encoding)'
UTF-8
$ python2 -c'import sys; print(sys.stdout.encoding)' | cat
None
$ PYTHONIOENCODING=utf8 python2 -c'import sys; print(sys.stdout.encoding)' | cat
utf8

Не вызывать sys.setdefaultencoding("UTF-8"); это может испортить ваши данные молча и / или сломать сторонние модули, которые этого не ожидают. Помните, что sys.getdefaultencoding() используется для преобразования bytestrings (str) в / из unicode в Python 2 неявно , например, "a" + u"b". См. Также цитату в ответе @ mesilliac .

0
задан Amit Daga 13 July 2018 в 13:22
поделиться