Как печатать кодированный текст 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 .