El método decode
de cadenas Unicode realmente no tiene ninguna aplicación en absoluto (a menos que tengas algunas ext datos en una cadena Unicode por alguna razón - ver a continuación). Es principalmente allí por razones históricas, creo. En Python 3, se ha ido por completo.
unicode().decode()
realizará una implícita codificación de s
usando el códec predeterminado (ascii). Verifique esto de la siguiente manera:
>>> 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 los mismos.
Para str().encode()
que es al revés - que intenta una implícita decodificación de s
con 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)
Se utiliza como este, str().encode()
también es superfluo.
Pero hay otra aplicación de este último método que es útil: hay encodings que no tienen nada que ver con los juegos de caracteres, y por lo tanto se puede aplicar a las cadenas de 8 bits de una manera significativa:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Sin embargo, tiene razón: el uso ambiguo de "codificación" para estas dos aplicaciones es ... awkard. Nuevamente, con tipos de byte
y string
separados en Python 3, esto ya no es un problema.
Creo que la segunda respuesta de [esta página] (http://stackoverflow.com/questions/10288016/usage-of-unicode-and-encode-functions-in-python) es lo suficientemente clara y concisa. – Ben