O decode
método de strings unicode realmente não possui nenhum aplicativo (a menos que você tenha alguns dados que não sejam de texto em uma string unicode por algum motivo - veja abaixo). É principalmente por razões históricas, eu acho. No Python 3, ele desapareceu completamente.
unicode().decode()
executará uma codificação implícita do s
uso do codec padrão (ascii). Verifique isso da seguinte maneira:
>>> 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)
As mensagens de erro são exatamente as mesmas.
Por str().encode()
que é o contrário - ele tenta um implícito decodificação de s
com a codificação padrão:
>>> 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)
Usado assim, str().encode()
também é supérfluo.
Mas há outra aplicação do último método que é útil: existem codificações que nada têm a ver com conjuntos de caracteres e, portanto, podem ser aplicadas a cadeias de 8 bits de maneira significativa:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Você está certo: o uso ambíguo de "codificação" para esses dois aplicativos é ... complicado. Novamente, com tipos byte
e string
tipos separados em Python 3, isso não é mais um problema.