Codifica sempre da Unicode a byte.
In questa direzione, puoi scegliere la codifica .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
L'altro modo è decodificare da byte a Unicode.
In questa direzione, devi sapere qual è la codifica .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Questo punto non può essere sottolineato abbastanza. Se vuoi evitare di giocare a "whack-a-mole" unicode, è importante capire cosa sta succedendo a livello di dati. Qui viene spiegato in un altro modo:
- Un oggetto Unicode è già decodificato, non vorrai mai chiamarlo
decode
.
- Un oggetto bytestring è già codificato, non vorrai mai chiamarlo
encode
.
Ora, vedendo .encode
una stringa di byte, Python 2 cerca prima di convertirlo implicitamente in testo (un unicode
oggetto). Allo stesso modo, vedendo .decode
su una stringa Unicode, Python 2 tenta implicitamente di convertirla in byte (un str
oggetto).
Queste conversioni implicite sono il motivo per cui puoi ottenere quando hai chiamato . È perché la codifica di solito accetta un parametro di tipo ; quando si riceve un parametro, c'è una decodifica implicita in un oggetto di tipo prima di ricodificarlo con un'altra codifica. Questa conversione sceglie un decodificatore "ascii" predefinito † , fornendo l'errore di decodifica all'interno di un codificatore.Unicode
Decode
Error
encode
unicode
str
unicode
In effetti, in Python 3 i metodi str.decode
e bytes.encode
non esistono nemmeno. La loro rimozione è stato un tentativo [controverso] di evitare questa confusione comune.
† ... o qualsiasi altra codifica sys.getdefaultencoding()
menzionata; di solito questo è "ascii"