В чем разница между encode/decode?
Я никогда не был уверен,что понимаю разницу между декодированием str/unicode и кодированием.
Я знаю, что str().decode()
- Это когда у вас есть строка байтов, которая, как вы знаете, имеет определенную кодировку символов, учитывая, что имя кодировки возвращает строку unicode.
Я знаю, что unicode().encode()
преобразует символы юникода в строку байтов в соответствии с заданным именем кодировки.
но я не понимаю, что str().encode()
и unicode().decode()
для. Может кто-нибудь объясните, и, возможно, также исправьте что-нибудь еще, что я получил неправильно выше?
EDIT:
несколько ответов дают информацию о том, что .encode
делает на строке, но никто, кажется, не знает, что .decode
делает для unicode.
7 ответов
на decode
метод строк unicode действительно не имеет никаких приложений вообще (если у вас нет каких-либо нетекстовых данных в строке unicode по какой-либо причине-см. ниже). Думаю, в основном по историческим причинам. В Python 3 он полностью исчез.
unicode().decode()
будет выполнять неявное кодирование of 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()
это наоборот - он пытается неявное декодирования of 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, это уже не проблема.
для представления строки юникода в виде строки байтов известен как кодирование. Использовать 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 всякий раз, когда вам нужно использовать ее для ввода-вывода, например, передать ее по сети или сохранить в файл диска.
преобразование строки байтов в строку Юникода называется декодирования. Использовать unicode('...', encoding)
или '...'.декодирование(кодирование).
пример:
>>> 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.кодирование('encoding') приводит к строка объект и может быть вызван на объекте unicode
aString.расшифруйте('encoding') приводит к unicode объект и может быть вызван в строке, закодированной в данной кодировке.
несколько объяснений:
вы можете создать некоторый объект unicode, который не имеет никакого набора кодировок. Способ, которым он хранится Python в памяти, не является вашим беспокойство. Вы можете искать его, разделить его и вызвать любую строку, манипулирующую функцией, которую вы любите.
но приходит время, когда вы хотите распечатать объект unicode для консоли или в какой-то текстовый файл. Так что вы должны кодирование it (например - в UTF-8), вы вызываете encode ('utf-8') и получаете строку с '\u
затем, опять же, вы хотели бы сделать наоборот-читать строку, закодированную в UTF-8, и рассматривать ее как Unicode, поэтому \u360 будет одним символом, а не 5. Тогда ты!--1-->расшифруйте строка (с выбранной кодировкой) и получить новый объект типа unicode.
просто в качестве примечания-вы можете выбрать некоторую извращенную кодировку, такую как "zip", "base64", "rot", и некоторые из них будут преобразовываться из строки в строку, но я считаю, что наиболее распространенным случаем является тот, который включает UTF-8/UTF-16 и string.
mybytestring.кодирование (somecodec) имеет значение для этих значений somecodec
:
- в base64
- bz2, что
- zlib
- hex
- quopri
- алгоритма ROT13
- string_escape
- uu
Я не уверен, что декодирование уже декодированного текста unicode хорошо. Попытка этого с любой кодировкой, похоже, всегда пытается сначала кодировать кодировку системы по умолчанию.
следует читать Python UnicodeDecodeError-я неправильно кодирую. Мое понимание unicode в Python было намного яснее после прочтения принятого ответа.
есть несколько кодировок, которые можно использовать для де-/кодирования из str в str или из unicode в unicode. Например base64, hex или даже rot13. Они перечислены в модуль кодеки.
изменить:
сообщение декодирования в строке unicode может отменить соответствующую операцию кодирования:
In [1]: u'0a'.decode('hex')
Out[1]: '\n'
возвращаемый тип-str вместо unicode, что, на мой взгляд, неудачно. Но когда вы не делаете правильный en - / decode между str и в любом случае, это выглядит как беспорядок.
самый простой ответ заключается в том, что они являются полной противоположностью друг друга.
компьютер использует самую основную единицу байта для хранения и обработки информации, это бессмысленно для человеческих глаз.
например, '\xe4\xb8\xad\xe6\x96\x87 '- это представление двух китайских иероглифов, но компьютер знает только (что означает печать или хранение), что это китайские иероглифы, когда им дается словарь для поиска этого китайского слова, в этом случае это словарь " utf-8, и он не сможет правильно показать предполагаемое китайское слово, если вы посмотрите в другой или неправильный словарь (используя другой метод декодирования).
в приведенном выше случае процесс поиска компьютером китайского слова-decoding().
и процесс компьютерной записи китайского языка в память компьютера-это encode ().
таким образом кодируют информацию необработанные байты, и расшифрованная информация необработанные байты и имя словарь ссылка (но не сам словарь).