Акцентированные символы в Python 2.7 [дубликат]

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

40
задан Brutus 30 June 2014 в 13:00
поделиться

3 ответа

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

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 .

4
ответ дан Community 16 August 2018 в 06:49
поделиться

Вот как я это делаю:

#!/usr/bin/python2.7 -S

import sys
sys.setdefaultencoding("utf-8")
import site

Обратите внимание на -S в bangline. Это говорит Python не автоматически импортировать модуль site. Модуль site - это то, что устанавливает кодировку по умолчанию, и удаляет метод, чтобы он не мог быть установлен снова. Но будет чтить то, что уже установлено.

22
ответ дан Keith 16 August 2018 в 06:49
поделиться
  • 1
    Не могли бы вы расширить это на основе ответа, который дал мезиллак? Это все еще правильно? – Arafangion 27 August 2013 в 07:10
  • 2
    @Arafangion Метод, который я использую, происходит в самом начале инициализации Python. Кэши еще не созданы. Я согласен с тем, что использование трюка reload плохое. Это связано с тем, что многие другие вещи, возможно, уже были созданы или кэшированы исходной кодировкой. Таким образом, я придумал этот метод, который случается рано. Обратите внимание, что перед ним нет другого импорта. Меня устраивает. – Keith 28 August 2013 в 06:24
  • 3
    Звучит неплохо. – Arafangion 29 August 2013 в 01:28
  • 4
    Хотя это работало для меня в тестах, я решил избежать этого . Просто неясно, могу ли я столкнуться с любыми побочными эффектами и неприятными запахами :-) Я просто обертываю sys.stdout в StreamWriter с кодировкой по умолчанию (что должно быть UTF-8, по крайней мере, в современных Linux-системах): sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout). – Brutus 29 April 2014 в 10:59
  • 5
    Это действительно плохая идея. За последние несколько недель я решил два вопроса, которые были устранены, удалив 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
27
ответ дан Nisse Engström 16 August 2018 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: