Я никогда не был уверен, что понимаю разницу между декодированием str / unicode и кодированием.
Я знаю, что str().decode()
для случая, когда у вас есть строка байтов, которая, как вы знаете, имеет определенную кодировку символов, при условии, что это имя кодировки вернет строку Unicode.
Я знаю, что unicode().encode()
преобразует символы Unicode в строку байтов в соответствии с заданным именем кодировки.
Но я не понимаю, для чего str().encode()
и unicode().decode()
для чего. Может ли кто-нибудь объяснить, а возможно и исправить что-то еще, что я ошибся выше?
РЕДАКТИРОВАТЬ:
Несколько ответов дают информацию о том, что .encode
делает на строке, но никто, кажется, не знает, что .decode
делает для Unicode.
Ответы:
decode
Метод Юникода строк действительно не имеет каких - либо приложений на всех (если у вас есть какие - то не-текстовые данные в юникод строку для какой - то причине - см . Ниже) Я думаю, что в основном это происходит по историческим причинам. В Python 3 это полностью исчезло.unicode().decode()
будет выполнять неявное кодирование сs
использованием кодека по умолчанию (ascii). Проверьте это так:Сообщения об ошибках точно такие же.
Для
str().encode()
это наоборот - она пытается неявное декодирование вs
с кодировкой по умолчанию:Используется вот так,
str().encode()
тоже лишнее.Но есть другое применение последнего метода, который полезен: есть кодировки , которые не имеют ничего общего с наборами символов и, таким образом, могут быть применены к 8-битным строкам осмысленным способом:
Вы правы, хотя: неоднозначное использование «кодирования» для обоих этих приложений ... удивительно. Опять же, с отдельными
byte
иstring
типами в Python 3, это больше не проблема.источник
.decode()
на строки Юникода могут быть полезны, например,print u'\\u0203'.decode('unicode-escape')
print u'\\u0203'.encode('utf8').decode('unicode-escape')
codecs.decode(u'\\u0203', 'unicode-escape')
ascii
кодировки:\\u0203\u00e4'.encode('ascii').decode('unicode-escape')
.encode('ascii').decode('unicode-escape')
) не зависит отsys.getdefaultencoding()
.Представление строки Юникода в виде строки байтов называется кодированием . Использование
u'...'.encode(encoding)
.Пример:
Вы обычно кодируете строку Unicode всякий раз, когда вам нужно использовать ее для ввода-вывода, например, передавать ее по сети или сохранять в файл на диске.
Преобразование строки байтов в строку Unicode называется декодированием . Используйте
unicode('...', encoding)
или '...'. Decode (кодировка).Пример:
Обычно вы декодируете строку байтов всякий раз, когда вы получаете строковые данные из сети или из файла на диске.
Я полагаю, что в Python 3 есть некоторые изменения в обработке Unicode, поэтому вышеприведенное, вероятно, не правильно для Python 3.
Несколько хороших ссылок:
источник
anUnicode. кодирование ('кодирование') приводит к строковому объекту и может быть вызвано для объекта Unicode
строка. decode ('encoding') приводит к объекту Unicode и может быть вызван на строку, закодированную в данной кодировке.
Еще несколько объяснений:
Вы можете создать некоторый объект Unicode, который не имеет никакой установленной кодировки. То, как он хранится в памяти Python, не имеет значения. Вы можете искать его, разбивать его и вызывать любую функцию управления строками, которая вам нравится.
Но наступает момент, когда вы хотите распечатать объект Unicode на консоли или в каком-либо текстовом файле. Таким образом, вы должны закодировать его (например, в UTF-8), вы вызываете кодирование ('utf-8'), и вы получаете строку с '\ u <someNumber>' внутри, которая отлично печатается.
Затем, опять же - вы хотели бы сделать обратное - прочитать строку, закодированную в UTF-8, и обработать ее как Unicode, чтобы \ u360 был одним символом, а не 5. Затем вы декодируете строку (с выбранной кодировкой) и получить новый объект типа Unicode.
Как примечание - вы можете выбрать некоторую извращенную кодировку, такую как 'zip', 'base64', 'rot', и некоторые из них будут конвертировать из строки в строку, но я считаю, что наиболее распространенным случаем является случай UTF-8 / UTF-16 и строка.
источник
mybytestring.encode (somecodec) имеет смысл для следующих значений
somecodec
:Я не уверен, для чего подходит декодирование уже декодированного текста Unicode. Попытка сделать это с любой кодировкой, кажется, всегда сначала пытается закодировать с использованием кодировки системы по умолчанию.
источник
Существует несколько кодировок, которые можно использовать для дешифрования / кодирования из str в str или из unicode в unicode. Например, base64, hex или даже rot13. Они перечислены в модуле кодеков .
Редактировать:
Сообщение декодирования в строке Unicode может отменить соответствующую операцию кодирования:
Возвращаемый тип str вместо unicode, что на мой взгляд неудачно. Но если вы не выполняете правильное кодирование / декодирование между str и unicode, это все равно выглядит как беспорядок.
источник
Простой ответ заключается в том, что они являются полной противоположностью друг другу.
Компьютер использует базовую единицу байта для хранения и обработки информации; это бессмысленно для человеческих глаз.
Например, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' - это представление двух китайских символов, но компьютер знает (что означает печать или хранение), что это китайские иероглифы, когда им дают словарь для поиска этого Китайское слово, в данном случае это словарь «utf-8», и оно не сможет правильно отобразить намеченное китайское слово, если вы загляните в другой или неправильный словарь (используя другой метод декодирования).
В приведенном выше случае процесс поиска на компьютере китайского слова
decode()
.И процесс компьютерной записи китайцев в компьютерную память идет
encode()
.Таким образом, закодированная информация - это необработанные байты, а декодированная информация - это необработанные байты и имя словаря для ссылки (но не сам словарь).
источник