decode
метод строк unicode действительно не имеет никаких приложений вообще (если у Вас нет некоторых нетекстовых данных в строке unicode по некоторым причинам - посмотрите ниже). Это главным образом там по историческим причинам, я думаю. В Python 3 этого полностью не стало.
unicode().decode()
выполнит неявное кодирование из s
использование значения по умолчанию (ASCII) кодек. Проверьте это как так:
>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
>>> s.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
сообщения об ошибках являются точно тем же.
Для str().encode()
это наоборот - это делает попытку неявного декодирование из s
с кодировкой по умолчанию:
>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
Используемый как это, str().encode()
является также лишним.
, Но существует другое применение последнего метода, который полезен: существуют кодировка , которые не имеют никакого отношения к наборам символов, и таким образом могут быть применены к 8-разрядным строкам значимым способом:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Вы правы, хотя: неоднозначное использование "кодирования" для обоих этих приложений... awkard. Снова, с отдельным byte
и string
типы в Python 3, это больше не проблема.
Для представления строки unicode как, строки байтов известна как кодирование . Используйте u'...'.encode(encoding)
.
Пример:
>>> u'æøå'.encode('utf8') '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5' >>> u'æøå'.encode('latin1') '\xc3\xa6\xc3\xb8\xc3\xa5' >>> u'æøå'.encode('ascii') UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
Вы обычно кодируете строку unicode каждый раз, когда необходимо использовать ее для IO, например, передайте ее по сети или сохраните ее к дисковому файлу.
Для преобразования строки байтов к строке unicode известен как декодирование . Используйте unicode('...', encoding)
или '... '.decode (кодирование).
Пример:
>>> u'æøå' u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1') u'\xc3\xa6\xc3\xb8\xc3\xa5' >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1') u'\xc3\xa6\xc3\xb8\xc3\xa5'
Вы обычно декодируете строку байтов каждый раз, когда Вы получаете строковые данные из сети или из дискового файла.
я полагаю, что существуют некоторые изменения в unicode, обрабатывающем в python 3, таким образом, вышеупомянутое, вероятно, не корректно для python 3.
Некоторые хорошие ссылки:
anUnicode. кодируют ('кодирование') результаты в строка объект и может быть назван на объекте unicode
aString. декодируют ('кодирование') результаты в объект unicode и может быть назван на строке, закодированной в данном кодировании.
<час>еще Некоторые объяснения:
можно создать некоторый объект unicode, который не имеет никакого набора кодирования. Путем это хранится Python в памяти, не ни одно из Вашего беспокойства. Можно искать его, разделить его и вызвать любую строковую функцию управления, которую Вы любите.
, Но там прибывает время, когда требуется распечатать объект unicode подключиться с консоли или в некоторый текстовый файл. Таким образом, Вы имеете к [1 111], кодируют это (например - в UTF-8), Вы звоните, кодируют ('utf-8'), и Вы получаете строку с '\u< someNumber>'; внутри, который является совершенно печатаемым.
Затем снова - требуется сделать противоположное - строка чтения, закодированная в UTF-8 и рассматривать его как Unicode, таким образом, \u360 будет одним символом, не 5. Тогда Вы декодируете строка (с выбранным кодированием) и получаете совершенно новый объект типа unicode.
Так же, как примечание стороны - можно выбрать некоторое извращенное кодирование, как 'zip', 'base64', 'гниль' и некоторые из них преобразует от строки до строки, но я полагаю, что наиболее распространенный случай является тем, который включает UTF-8/UTF-16 и строка.
mybytestring.encode (somecodec) значим для этих значений somecodec
:
я не уверен, для какого декодирования уже декодируемый unicode текст хорош. Попытка этого с любым кодированием, кажется, всегда пытается закодировать кодировкой по умолчанию системы сначала.
Существует несколько кодировок, которые могут привыкнуть к de-/encode от str до str или от unicode до unicode. Например, base64, шестнадцатеричное число или даже rot13. Они перечислены в эти модуль кодеков .
Редактирование:
сообщение декодирования на строке unicode может отменить соответствие, кодируют операцию:
In [1]: u'0a'.decode('hex')
Out[1]: '\n'
возвращенный тип является str вместо unicode, который неудачен, по-моему. Но когда Вы не делаете надлежащего en-/decode между str и unicode, это похоже на путаницу так или иначе.