decode
Метод Юникода рядків дійсно не має яких - або додатків на всіх (якщо у вас є якісь - то чи не-текстові дані в юнікод рядок для якої - то причини - див . Нижче) Я думаю, що це переважно з історичних причин. У 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 це вже не проблема.