Какова связь между «Unicode» и «кодировать» - PullRequest
1 голос
/ 08 января 2010
print u'\xe4\xf6\xfc'.encode('utf-8')
print unicode(u'\xe4\xf6\xfc')

отслеживающий:

盲枚眉
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    print unicode(u'\xe4\xf6\xfc')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

оболочка питона

>>>u"äöü".encode('utf-8')
Unsupported characters in input

Ответы [ 3 ]

12 голосов
/ 08 января 2010

В Python 2:

case a: (unicode object).encode(somecodec) -> string of bytes
case b: (string of bytes).decode(somecodec) -> unicode object
case c: unicode(string of bytes, somecodec) -> unicode object

Случаи b и c идентичны. В каждом из трех случаев вы можете опустить имя кодека: тогда по умолчанию используется 'ascii', декодер ASCII (поддерживает только 128 символов ASCII - в противном случае вы получите исключение).

Всякий раз, когда слева от стрелки требуется «строка байтов», вы можете передать объект Unicode (он конвертируется с помощью кодека «ascii»).

Всякий раз, когда слева от стрелки требуется «Юникод», вы можете передать строку байтов (она преобразуется с помощью кодека «ascii»).

6 голосов
/ 08 января 2010

Ошибка кодирования:

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
äöü
0 голосов
/ 08 января 2010

Это рассматривается в учебном пособии и юникодном руководстве

Функция unicode преобразует строки, не относящиеся к юникоду (по умолчанию ascii, но допускает и другие кодировки), в строки юникода. Ваша ошибка здесь в том, что вы передаете строку, которая уже является Unicode, и просите ее преобразовать в Unicode ...

Функция encode в строке Unicode преобразует ее обратно в не-Unicode-кодировку - опять же, ascii по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...