Python 3-Encode / Decode vs Bytes / Str [дубликат]


этот вопрос уже есть ответ здесь:

  • Лучший способ конвертировать строку в байты в Python 3? 5 ответов

Я новичок в python3, исходя из python2, и я немного запутался с основами unicode. Я прочитал несколько хороших сообщений, которые сделали все намного яснее, однако я вижу, что на python 3 есть 2 метода, которые обрабатывают кодирование и декодирование, и я не уверен, какой из них использовать.

таким образом, идея в python 3 заключается в том, что каждая строка является unicode и может быть закодирована и сохранена в байтах или снова декодирована в строку unicode.

но есть 2 способа сделать это:
u'something'.encode('utf-8') будет генерировать b'bytes', но и bytes(u'something', 'utf-8').
И b'bytes'.decode('utf-8') кажется, делает то же самое, что и str(b'', 'utf-8').

теперь мой вопрос, почему существуют 2 метода, которые, кажется, делают то же самое, и либо лучше, чем другие (и почему?) Я пытался найти ответ в Google, но не повезло.

>>> original = '27岁少妇生孩子后变老'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x8127xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27岁少妇生孩子后变老
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27岁少妇生孩子后变老
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x81', 'utf-8'))
27岁少妇生孩子后变老
>>> print(b'27xe5xb2x81xe5xb0x91xe5xa6x87xe7x94x9fxe5xadxa9xe5xadx90xe5x90x8exe5x8fx98xe8x80x81'.decode('utf-8'))
27岁少妇生孩子后变老
3 61

3 ответа:

ни один не лучше другого, они делают точно то же самое. Однако, используя .encode() и .decode() это более распространенный способ сделать это. Он также совместим с Python 2.

добавить ответ Леннарта Реджебро есть еще третий способ, который можно использовать:

encoded3 = str.encode(original, 'utf-8')
print(encoded3)

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


язык программирования-это средство формального выражения абстрактных идей, которые должны выполняться машиной. Язык программирования считается хорошим, если он содержит конструкции, которые нужны. Питон это гибридный язык-т. е. более естественный и более универсальный, чем чистый ОО или чистые процедурные языки. Иногда функции более уместны, чем объектные методы, иногда верно обратное. Это зависит от мысленной картины решаемой задачи.

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

иными словами, вызов метода объекта означает мышление в терминах "пусть объект дает мне желаемый результат". Вызов функции в качестве альтернативы означает "пусть внешний код обрабатывает переданный аргумент и извлекает нужное значение".

первый подход подчеркивает способность объекта выполнять задачу самостоятельно, второй подход подчеркивает способность отдельного алгоритма извлекать данные. Иногда отдельный код может быть настолько особенным, что его нецелесообразно добавлять в качестве общего метода в класс объекта.

чтобы добавить к предыдущему ответу, есть даже четвертый способ, который можно использовать

import codecs
encoded4 = codecs.encode(original, 'utf-8')
print(encoded4)