Sempre codifique de Unicode para bytes.
Nesse sentido, você pode escolher a codificação .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
A outra maneira é decodificar de bytes para Unicode.
Nesse sentido, você deve saber qual é a codificação .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Este ponto nunca pode ser enfatizado o suficiente. Se você quiser evitar jogar "whack-a-mole" unicode, é importante entender o que está acontecendo no nível dos dados. Aqui é explicado de outra maneira:
- Um objeto Unicode já está decodificado, você nunca vai querer chamá
decode
-lo.
- Um objeto bytestring já está codificado, você nunca vai querer chamá
encode
-lo.
Agora, ao ver .encode
uma string de bytes, Python 2 primeiro tenta convertê-la implicitamente em texto (um unicode
objeto). Da mesma forma, ao ver .decode
uma string Unicode, o Python 2 tenta implicitamente convertê-la em bytes (um str
objeto).
Essas conversões implícitas são o motivo pelo qual você pode obter quando liga . É porque a codificação geralmente aceita um parâmetro do tipo ; ao receber um parâmetro, há uma decodificação implícita em um objeto do tipo antes de recodificá-lo com outra codificação. Esta conversão escolhe um decodificador 'ascii' padrão † , dando a você o erro de decodificação dentro de um codificador.Unicode
Decode
Error
encode
unicode
str
unicode
De fato, em Python 3 os métodos str.decode
e bytes.encode
nem sequer existem. Sua remoção foi uma tentativa [controversa] de evitar essa confusão comum.
† ... ou qualquer sys.getdefaultencoding()
menção de codificação ; normalmente é 'ascii'