Linux / Python: кодирование строки Unicode для печати - PullRequest
19 голосов
/ 24 февраля 2011

У меня довольно большое приложение на python 2.6 с разбросанными множеством операторов печати. Я использую строки Unicode везде, и это обычно прекрасно работает. Однако, если я перенаправляю вывод приложения (например, «myapp.py> output.txt»), то иногда получаю ошибки, такие как эта:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)

Полагаю, возникает та же проблема, если кто-то установил для LOCALE значение ASCII. Теперь я прекрасно понимаю причину этой ошибки. В моих строках Unicode есть символы, которые невозможно кодировать в ASCII. Справедливо. Но я бы хотел, чтобы моя программа на Python постаралась напечатать что-нибудь понятное, возможно, пропустив подозрительные символы или заменив их идентификаторами Unicode.

Эта проблема должна быть распространенной ... Какова лучшая практика для решения этой проблемы? Я бы предпочел решение, позволяющее мне продолжать использовать обычный старый «отпечаток», но я могу при необходимости изменить все вхождения.

PS: я решил эту проблему. Решение не было ни одним из приведенных ответов. Я использовал метод, указанный в http://wiki.python.org/moin/PrintFails, как указано ChrisJ в одном из комментариев. То есть я заменяю sys.stdout оболочкой, которая вызывает unicode encode с правильными аргументами. Работает очень хорошо.

Ответы [ 3 ]

18 голосов
/ 24 февраля 2011

Если вы выполняете дамп на терминал ASCII, закодируйте вручную с помощью unicode.encode и укажите, что ошибки следует игнорировать.

u = u'\xa0'
u.encode('ascii') # This fails
u.encode('ascii', 'ignore') # This replaces failed encoding attempts with empty string

Если вы хотите хранить файлы Unicode, попробуйте это:

u = u'\xa0'
print >>open('out', 'w'), u # This fails
print >>open('out', 'w'), u.encode('utf-8') # This is ok
5 голосов
/ 07 марта 2011

Я теперь решил эту проблему.Решение не было ни одним из данных ответов.Я использовал метод, указанный в http://wiki.python.org/moin/PrintFails, как указано ChrisJ в одном из комментариев.То есть я заменяю sys.stdout оболочкой, которая вызывает unicode encode с правильными аргументами.Работает очень хорошо.

2 голосов
/ 24 февраля 2011

Либо оберните все свои операторы печати с помощью метода, выполняющего произвольное преобразование Unicode -> UTF8, либо в качестве крайней меры измените кодировку Python по умолчанию с ascii на utf-8 внутри вашего site.py.В общем, плохая идея - выводить строки Юникода без фильтра в sys.stdout, так как Python инициирует импактное преобразование строк Юникода в настроенную кодировку по умолчанию, которая является ascii.

...