Функция декодирования пытается кодировать Python - PullRequest
7 голосов
/ 26 января 2011

Я пытаюсь напечатать строку в кодировке Юникод без определенного шестнадцатеричного кодирования.Я собираю эти данные с Facebook, который имеет тип кодировки в HTML-заголовках UTF-8.Когда я печатаю тип - он говорит, что это юникод, но затем, когда я пытаюсь декодировать его с помощью escape-кода, появляется ошибка кодирования.Почему он пытается кодировать, когда я использую метод декодирования?

Код

a='really long string of unicode html text that i wont reprint'
print type(a)
 >>> <type 'unicode'>   
print a.decode('unicode-escape')
 >>> Traceback (most recent call last):
  File "scfbp.py", line 203, in myFunctionPage
    print a.decode('unicode-escape')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128)

Ответы [ 3 ]

8 голосов
/ 26 января 2011

Это не декодирование, которое терпит неудачу.Это потому, что вы пытаетесь отобразить результат на консоли.Когда вы используете print, он кодирует строку, используя кодировку по умолчанию ASCII.Не используйте печать, и это должно работать.

>>> a=u'really long string containing \\u20ac and some other text'
>>> type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
u'really long string containing \u20ac and some other text'
>>> print a.decode('unicode-escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128)

Я бы порекомендовал использовать IDLE или другой интерпретатор, который может выводить Unicode, тогда у вас не возникнет этой проблемы.


Обновление: обратите внимание, что это не то же самое, что ситуация с одной обратной косой чертой, где происходит сбой во время декодирования, но с тем же сообщением об ошибке:

>>> a=u'really long string containing \u20ac and some other text'
>>> type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128)
3 голосов
/ 26 января 2011

Когда вы печатаете на консоль, Python пытается закодировать (преобразовать) строку в набор символов вашего терминала. Если это не UTF-8 или что-то, что не отображает все символы в строке, он будет скулить и выдавать исключение.

Это время от времени цепляет меня, когда я делаю быструю обработку данных, например, с турецкими символами.

Если вы запускаете python.exe через командную строку Windows, вы можете найти здесь несколько решений: Какая кодировка / кодовая страница - cmd.exe с использованием . В основном вы можете изменить кодовую страницу с помощью chcp, но это довольно громоздко. Я бы следовал совету Марка и использовал бы что-то вроде IDLE.

2 голосов
/ 26 января 2011
>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')

Почему он пытается кодировать, когда я использую метод декодирования?

Поскольку вы декодируете в Unicode и кодируете из.Вы только что попытались декодировать строку Unicode в Unicode.Сначала он пытается преобразовать его в строку с помощью кодека ascii.Вот почему вы получаете:

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

Помните: Юникод не является кодировкой.Все остальное, как ascii, utf8, latin-1 и т. Д.

Эта неявная кодировка отсутствует в Python 3, кстати, потому что она смущает людей.

...