El decode
método de cadenas unicode realmente no tiene ninguna aplicación (a menos que tenga algunos datos que no sean de texto en una cadena unicode por alguna razón, consulte a continuación). Está principalmente allí por razones históricas, creo. En Python 3 se ha ido por completo.
unicode().decode()
realizará una codificación implícita de s
usar el códec predeterminado (ascii). Verifique esto así:
>>> 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)
Los mensajes de error son exactamente iguales.
Porque str().encode()
es al revés: intenta una decodificación implícita de s
la codificación predeterminada:
>>> 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 así, str().encode()
también es superfluo.
Pero hay otra aplicación del último método que es útil: hay codificaciones que no tienen nada que ver con los conjuntos de caracteres y, por lo tanto, se pueden aplicar a cadenas de 8 bits de manera significativa:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Sin embargo, tiene razón: el uso ambiguo de la "codificación" para ambas aplicaciones es ... extraño. Una vez más, con los tipos separados byte
y string
en Python 3, esto ya no es un problema.