Il decode
metodo delle stringhe unicode in realtà non ha alcuna applicazione (a meno che tu non abbia alcuni dati non testuali in una stringa unicode per qualche motivo - vedi sotto). È principalmente lì per motivi storici, penso. In Python 3 è completamente sparito.
unicode().decode()
eseguirà un implicito codifica di s
utilizzare il (ASCII) codec predefinito. Verifica in questo modo:
>>> 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)
I messaggi di errore sono esattamente gli stessi.
Per str().encode()
è il contrario - tenta un implicito decodifica di s
con la codifica predefinita:
>>> 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)
Usato in questo modo, str().encode()
è anche superfluo.
Ma c'è un'altra applicazione di quest'ultimo metodo che è utile: ci sono codifiche che non hanno nulla a che fare con i set di caratteri, e quindi possono essere applicate alle stringhe a 8 bit in modo significativo:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Hai ragione, però: l'uso ambiguo della "codifica" per entrambe queste applicazioni è ... imbarazzante. Ancora una volta, con separati byte
e string
tipi in Python 3, questo non è più un problema.