Каково различие между, кодируют/декодируют?

173
задан cedbeu 16 May 2013 в 09:52
поделиться

5 ответов

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, это больше не проблема.

104
ответ дан 23 November 2019 в 20:37
поделиться

Для представления строки 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.

Некоторые хорошие ссылки:

70
ответ дан codeape 23 November 2019 в 20:37
поделиться

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 и строка.

15
ответ дан Abgan 23 November 2019 в 20:37
поделиться

mybytestring.encode (somecodec) значим для этих значений somecodec:

  • шестнадцатеричное число base64
  • bz2
  • zlib
  • quopri
  • rot13
  • string_escape
  • uu

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

12
ответ дан nosklo 23 November 2019 в 20:37
поделиться

Существует несколько кодировок, которые могут привыкнуть к de-/encode от str до str или от unicode до unicode. Например, base64, шестнадцатеричное число или даже rot13. Они перечислены в эти модуль кодеков .

Редактирование:

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

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

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

5
ответ дан 23 November 2019 в 20:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: