Путаница в методе декодирования Python

Я пытаюсь запустить команду u'\xe1'.decode("utf-8") в python и получаю эту ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 0: ordinal not in range(128)

Почему он говорит, что я пытаюсь декодировать ascii, когда я передаю utf-8 в качестве первого аргумента? В дополнение к этому, есть ли способ получить символ á из u'\xe1' и сохранить его в строке?


person Leo C Han    schedule 20.11.2014    source источник
comment
Что именно ты пытаешься сделать?   -  person Padraic Cunningham    schedule 21.11.2014
comment
Скрипт python, который я запускаю, принимает текст, обрабатывает его и печатает строку JSON, содержащую версию исходного текста по категориям. Я заметил, что такие символы иногда оказываются их значениями Unicode в напечатанной строке JSON.   -  person Leo C Han    schedule 21.11.2014
comment
когда вы напечатаете свою строку, вы увидите á   -  person Padraic Cunningham    schedule 21.11.2014
comment
Так я смог решить проблему. Спасибо, ребята, за помощь. Но я все еще не понимаю, почему в ошибке говорится, что это ascii проблема с кодировкой, когда я вместо этого использую utf-8.   -  person Leo C Han    schedule 22.11.2014


Ответы (1)


decode возьмет строку и преобразует ее в юникод (например: "\xb0".decode("utf8") ==> u"\xb0")

encode примет Unicode и преобразует его в строку (например: u"\xb0".encode("utf8") ==> "\xb0")

ни один из них не имеет ничего общего с рендерингом строки ... это в основном внутреннее представление

пытаться

print u"\xe1"

(ваш терминал должен будет поддерживать юникод (простоя будет работать ... терминал dos не так много))

>>> print u"\xe1"
á
>>> print repr(u"\xe1".encode("utf8"))
'\xc3\xa1'
>>> print repr("\xc3\xa1".decode("utf8"))
u'\xe1'
person Joran Beasley    schedule 20.11.2014
comment
эй, мы тоже можем это сделать? ››› chr (ord (\ xe1)) 'á' - person Hackaholic; 21.11.2014
comment
Правило, данное в ответе, в основном верно для 2.x, возможно, всегда для 3.x. Пример вывода для 2.x, немного отличается в 3.x. - person Terry Jan Reedy; 21.11.2014
comment
в Python 2 это >>> unichr(ord("\xe1")) 'á' @Hackaholic - person Joran Beasley; 21.11.2014