Codieren Sie immer von Unicode zu Bytes.
In dieser Richtung können Sie die Codierung auswählen .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
Die andere Möglichkeit besteht darin, von Bytes in Unicode zu dekodieren.
In dieser Richtung müssen Sie die Codierung kennen .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Dieser Punkt kann nicht genug betont werden. Wenn Sie vermeiden möchten, Unicode "Whack-a-Mole" zu spielen, ist es wichtig zu verstehen, was auf Datenebene passiert. Hier wird es anders erklärt:
- Ein Unicode-Objekt ist bereits dekodiert, Sie möchten es nie mehr aufrufen
decode
.
- Ein bytestring-Objekt ist bereits codiert, Sie möchten es niemals aufrufen
encode
.
Wenn .encode
Python 2 nun eine Byte-Zeichenfolge sieht , versucht es zunächst, sie implizit in Text (ein unicode
Objekt) zu konvertieren . In ähnlicher Weise .decode
versucht Python 2 beim Anzeigen einer Unicode-Zeichenfolge implizit, diese in Bytes (ein str
Objekt) zu konvertieren .
Diese impliziten Konvertierungen sind der Grund, warum Sie erhalten können, wenn Sie angerufen haben . Dies liegt daran, dass die Codierung normalerweise einen Parameter vom Typ akzeptiert . Beim Empfang eines Parameters erfolgt eine implizite Dekodierung in ein Objekt vom Typ, bevor es mit einer anderen Codierung neu codiert wird. Bei dieser Konvertierung wird ein Standard-ASCII-Decoder † ausgewählt , der den Decodierungsfehler in einem Encoder anzeigt.Unicode
Decode
Error
encode
unicode
str
unicode
Tatsächlich existieren in Python 3 die Methoden str.decode
und bytes.encode
existieren nicht einmal. Ihre Entfernung war ein [kontroverser] Versuch, diese allgemeine Verwirrung zu vermeiden.
† ... oder was auch immer Codierung sys.getdefaultencoding()
erwähnt; normalerweise ist dies 'ascii'