Codifique siempre de Unicode a bytes.
En esta dirección, puedes elegir la codificación .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
La otra forma es decodificar de bytes a Unicode.
En esta dirección, debes saber cuál es la codificación .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Este punto no se puede enfatizar lo suficiente. Si desea evitar jugar unicode "whack-a-mole", es importante comprender lo que sucede a nivel de datos. Aquí se explica de otra forma:
- Un objeto Unicode ya está decodificado, nunca querrás llamarlo
decode
.
- Un objeto de cadena de bytes ya está codificado, nunca querrás llamarlo
encode
.
Ahora, al ver .encode
una cadena de bytes, Python 2 primero intenta convertirlo implícitamente en texto (un unicode
objeto). De manera similar, al ver .decode
una cadena Unicode, Python 2 implícitamente intenta convertirla en bytes (un str
objeto).
Estas conversiones implícitas son la razón por la que puede obtener cuando ha llamado . Es porque la codificación generalmente acepta un parámetro de tipo ; al recibir un parámetro, hay una decodificación implícita en un objeto de tipo antes de volver a codificarlo con otra codificación. Esta conversión elige un decodificador 'ascii' † predeterminado , lo que le da el error de decodificación dentro de un codificador.Unicode
Decode
Error
encode
unicode
str
unicode
De hecho, en Python 3 los métodos str.decode
y bytes.encode
ni siquiera existen. Su remoción fue un intento [controvertido] de evitar esta confusión común.
† ... o lo que sys.getdefaultencoding()
mencione la codificación ; generalmente esto es 'ascii'