Sempre codifica da unicode a byte.
In questa direzione, è possibile scegliere la codifica.
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
L'altro modo è quello di decodificare da byte a unicode.
In questa direzione, devi sapere che cos'è 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 unicode "whack-a-mole", è importante capire cosa sta succedendo a livello di dati. Qui è spiegato un altro modo:
- Un oggetto unicode è già decodificato, non si desidera chiamare
decode
su di esso.
- Un oggetto testuale è già codificato, non si desidera mai chiamare
encode
su di esso.
Ora, vedendo .encode
su una stringa di byte, Python 2 tenta prima di convertire in modo implicito in testo (un oggetto unicode
). Allo stesso modo, vedendo .decode
su una stringa unicode, Python 2 tenta implicitamente di convertirlo in byte (un oggetto str
).
Queste conversioni implicite sono il motivo per cui è possibile ottenere Unicode
Decode
Error
quando hai chiamato encode
. È perché la codifica di solito accetta un parametro di tipo unicode
; quando si riceve un parametro str
, c'è una decodifica implicita in un oggetto di tipo unicode
prima di ricodificarlo con un'altra codifica. Questa conversione sceglie un decodificatore 'ascii' predefinito †, fornendo l'errore di decodifica all'interno di un encoder.
Infatti, in Python 3 i metodi str.decode
e bytes.encode
non esistono nemmeno. La loro rimozione fu un tentativo [controverso] di evitare questa confusione comune.
† ... o qualsiasi codifica sys.getdefaultencoding()
menzioni; Di solito questo è 'ascii'
Quindi qual è la soluzione? Soprattutto se non ho una stringa letterale, ho solo un oggetto stringa. –
@JonTirsen, non dovresti codificare un oggetto stringa. Un oggetto stringa è già codificato. Se è necessario modificare la codifica, è necessario decodificarla in una stringa unicode e quindi codificarla come codifica desiderata. –
Quindi per dirlo chiaramente dall'alto puoi '" 你好 ".decode ('utf-8'). Encode ('utf-8')' – deinonychusaur