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 .encodeuna stringa di byte, Python 2 cerca prima di convertirlo implicitamente in testo (un unicodeoggetto). Allo stesso modo, vedendo .decodesu una stringa Unicode, Python 2 tenta implicitamente di convertirla in byte (un stroggetto).
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.UnicodeDecodeErrorencodeunicodestrunicode
In effetti, in Python 3 i metodi str.decodee bytes.encodenon 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"