В зависимости от того, насколько характерна эта функциональность для вашего проекта, вы можете рассмотреть что-то вроде MEF , которое позаботится о загрузке и связывании компонентов для вас.
Как печатать кодированный текст 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 .
Вот как я это делаю:
#!/usr/bin/python2.7 -S
import sys
sys.setdefaultencoding("utf-8")
import site
Обратите внимание на -S
в bangline. Это говорит Python не автоматически импортировать модуль site
. Модуль site
- это то, что устанавливает кодировку по умолчанию, и удаляет метод, чтобы он не мог быть установлен снова. Но будет чтить то, что уже установлено.
sys.stdout
в StreamWriter
с кодировкой по умолчанию (что должно быть UTF-8, по крайней мере, в современных Linux-системах): sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
.
– Brutus
29 April 2014 в 10:59
sys.setdefaultencoding("utf-8")
из кода пользователя. IMHO, это просто маскирует любые основные проблемы
– Alastair McCormack
29 November 2015 в 00:15
Кажется, что это не рекомендуется.
Fedora предложила использовать языковой стандарт системы по умолчанию , но, по-видимому, это нарушает другие вещи.
цитата из обсуждения рассылки :
The only supported default encodings in Python are: Python 2.x: ASCII Python 3.x: UTF-8 If you change these, you are on your own and strange things will start to happen. The default encoding does not only affect the translation between Python and the outside world, but also all internal conversions between 8-bit strings and Unicode. Hacks like what's happening in the pango module (setting the default encoding to 'utf-8' by reloading the site module in order to get the sys.setdefaultencoding() API back) are just downright wrong and will cause serious problems since Unicode objects cache their default encoded representation. Please don't enable the use of a locale based default encoding. If all you want to achieve is getting the encodings of stdout and stdin correctly setup for pipes, you should instead change the .encoding attribute of those (only). -- Marc-Andre Lemburg eGenix.com