В чем разница между encode/decode?


Я никогда не был уверен, что понимаю разницу между STR/unicode decode и encode.

Я знаю, что str().decode() Это когда у вас есть строка байтов, которая, как вы знаете, имеет определенную кодировку символов, учитывая, что имя кодировки он будет возвращать строку Юникода.

Я знаю, что unicode().encode() преобразует символы юникода в строку байтов в соответствии с заданным именем кодировки.

но я не понимаю, что str().encode() и unicode().decode() для. Может кто-нибудь объясните, и, возможно, также исправьте что-нибудь еще, что я ошибся выше?

EDIT:

несколько ответов дают информацию о том, что .encode делает на строку, но никто, кажется, не знает, что .decode делает для unicode.

7 161

7 ответов:

The 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'

вы правы, хотя: неоднозначное использование "кодирования"для обоих этих приложений... неловко. Опять же, с отдельным 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. encode('кодировка') приводит к string объект и может быть вызван на объект unicode

aString.расшифруйте('кодировка') приводит к unicode объект и может быть вызван на строку, закодированную в заданной кодировке.


несколько объяснений:

вы можете создать некоторый объект unicode, который не имеет никакого набора кодировок. То, как он хранится Python в памяти, не является вашим беспокойство. Вы можете искать его, разделить его и вызвать любую строку, манипулирующую функцией, которую вы хотите.

но приходит время, когда вы хотите распечатать свой объект unicode в консоль или в какой-то текстовый файл. Так что вы должны encode it (например - в UTF-8), вы вызываете encode ('utf-8') и получаете строку с '\u' внутри, которая отлично печатается.

затем снова - вы хотели бы сделать обратное - прочитать строку, закодированную в UTF-8, и рассматривать ее как Unicode, так что \u360 будет один символ, а не 5. Тогда ты расшифруйте строка (с выбранной кодировкой) и получить совершенно новый объект типа 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. Они перечислены в модуль кодеки.

Edit:

сообщение декодирования в строке unicode может отменить соответствующую операцию кодирования:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

возвращаемый тип-str вместо unicode, который, на мой взгляд, неудачен. Но когда вы не делаете правильный en - / декодировать между str и unicode это выглядит как беспорядок в любом случае.

самый простой ответ заключается в том, что они являются полной противоположностью друг друга.

компьютер использует самую основную единицу байта для хранения и обработки информации, это бессмысленно для человеческих глаз.

например, '\xe4\xb8\xad\xe6\x96\x87 '- это представление двух китайских символов, но компьютер знает только (что означает печать или хранение) это китайские символы, когда им дается словарь для поиска этого китайского слова, в этом случае это словарь " utf-8, и он не сможет правильно показать предполагаемое китайское слово, если вы посмотрите в другой или неправильный словарь(используя другой метод декодирования).

в приведенном выше случае процесс для компьютера, чтобы искать китайское слово декодирования().

и процесс компьютерной записи китайского языка в память компьютера кодируется ().

таким образом, информация кодирования-это необработанные байты, а декодированная информация-это необработанные байты и имя словаря, чтобы ссылка (но не сам словарь).