Ошибка кодирования:
print unicode(u'\xe4\xf6\xfc')
Вызов unicode()
здесь ничего не делает, так как его параметр уже является объектом Unicode. print
затем пытается вывести этот объект Unicode, и для этого print
хочет преобразовать его в строку в кодировке вашего терминала. Но python, похоже, не знает, какую кодировку использует ваш терминал, и поэтому использует «безопасную» альтернативу Ascii.
Поскольку u'\xe4\xf6\xfc'
не может быть представлено в Ascii, это приводит к ошибке кодирования.
Юникод, кодирование и декодирование:
Обычно encode()
преобразует объект Unicode в строку с определенной кодировкой символов, такой как UTF-8 или ISO-8859-1. Каждая кодовая точка Юникода преобразуется в последовательность байтов в этой кодировке:
>>> u'\xe4\xf6\xfc'.encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
Противоположным является decode()
, он преобразует строку в определенной кодировке в объект Unicode, содержащий соответствующие кодовые точки Unicode.
>>> '\xc3\xa4\xc3\xb6\xc3\xbc'.decode('utf-8')
u'\xe4\xf6\xfc'
Печать:
print
со строковым параметром просто печатает необработанные байты этой строки. Если это приводит к желаемому выводу, зависит от кодировки символов терминала.
>>> print '\xc3\xa4\xc3\xb6\xc3\xbc' # utf-8 encoding on utf-8 terminal
äöü
>>> print '\xe4\xf6\xfc' # same encoded as latin-1
���
Когда задан параметр Unicode, print
сначала пытается закодировать объект Unicode в кодировке терминалов. Это работает, только если python угадывает правильную кодировку для терминала и эта кодировка может фактически представлять все символы объекта Unicode. В противном случае кодировка выдает исключения или вывод содержит неправильные символы.
>>> print u'\xe4\xf6\xfc' # it correctly assumes a utf-8 terminal
äöü