Encodez toujours de Unicode en octets.
Dans cette direction, vous choisissez l'encodage .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
L'autre façon consiste à décoder des octets en unicode.
Dans ce sens, vous devez savoir quel est le codage .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Ce point ne peut pas être assez souligné. Si vous voulez éviter de jouer unicode "whack-a-mole", il est important de comprendre ce qui se passe au niveau des données. Ici, il est expliqué d'une autre manière:
- Un objet Unicode est déjà décodé, vous ne voulez jamais l'appeler
decode
.
- Un objet bytestring est déjà encodé, vous ne voulez jamais l'appeler
encode
.
Maintenant, en voyant .encode
une chaîne d'octets, Python 2 essaie d'abord de la convertir implicitement en texte (un unicode
objet). De même, en voyant .decode
sur une chaîne unicode, Python 2 essaie implicitement de la convertir en octets (un str
objet).
Ces conversions implicites sont la raison pour laquelle vous pouvez obtenir lorsque vous avez appelé . C'est parce que l'encodage accepte généralement un paramètre de type ; lors de la réception d'un paramètre, il y a un décodage implicite dans un objet de type avant de le recoder avec un autre encodage. Cette conversion choisit un décodeur «ascii» par défaut † , vous donnant l'erreur de décodage à l'intérieur d'un encodeur.Unicode
Decode
Error
encode
unicode
str
unicode
En fait, en Python 3 , les méthodes str.decode
et bytes.encode
n'existent même pas. Leur suppression était une tentative [controversée] d'éviter cette confusion courante.
† ... ou tout ce que le codage sys.getdefaultencoding()
mentionne; il s'agit généralement de 'ascii'