Подтвердить что ты не робот

Linux/Python: кодирование строки юникода для печати

У меня довольно большое приложение 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 с правильными аргументами. Очень хорошо работает.

4b9b3361

Ответ 1

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

Ответ 2

Если вы сбрасываете на терминал 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

Ответ 3

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