Ich bin wirklich verwirrt. Ich habe versucht zu codieren, aber der Fehler sagte can't decode...
.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Ich weiß, wie ich den Fehler mit dem Präfix "u" in der Zeichenfolge vermeiden kann. Ich frage mich nur, warum der Fehler "Kann nicht dekodieren" ist, als die Kodierung aufgerufen wurde. Was macht Python unter der Haube?
"你好".decode('utf-8').encode('utf-8')
Codieren Sie immer von Unicode zu Bytes.
In dieser Richtung können Sie die Codierung auswählen .
Die andere Möglichkeit besteht darin, von Bytes in Unicode zu dekodieren.
In dieser Richtung müssen Sie die Codierung kennen .
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:
decode
.encode
.Wenn
.encode
Python 2 nun eine Byte-Zeichenfolge sieht , versucht es zunächst, sie implizit in Text (einunicode
Objekt) zu konvertieren . In ähnlicher Weise.decode
versucht Python 2 beim Anzeigen einer Unicode-Zeichenfolge implizit, diese in Bytes (einstr
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
undbytes.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'quelle
_
bezieht sich in der REPL auf den vorherigen Wert 2., da dies eine Python-2.x-Frage ist.Sie können dies versuchen
Oder
Sie können auch versuchen, zu folgen
Fügen Sie die folgende Zeile oben in Ihre .py-Datei ein.
quelle
Wenn Sie Python <3 verwenden, müssen Sie dem Interpreter mitteilen, dass Ihr Zeichenfolgenliteral Unicode ist, indem Sie ihm Folgendes voranstellen
u
:Weiterführende Literatur : Unicode HOWTO .
quelle
Sie verwenden
u"你好".encode('utf8')
diese Option, um eine Unicode-Zeichenfolge zu codieren. Aber wenn Sie darstellen möchten"你好"
, sollten Sie es dekodieren. So wie:Sie werden bekommen, was Sie wollen. Vielleicht sollten Sie mehr über das Codieren und Decodieren erfahren.
quelle
Wenn Sie sich mit Unicode beschäftigen, können Sie manchmal
encode('utf-8')
auch versuchen, die Sonderzeichen zu ignorieren, zoder wie
something.decode('unicode_escape').encode('ascii','ignore')
hier vorgeschlagen .In diesem Beispiel nicht besonders nützlich, kann aber in anderen Szenarien besser funktionieren, wenn einige Sonderzeichen nicht konvertiert werden können.
Alternativ können Sie ein bestimmtes Zeichen durch ersetzen
replace()
.quelle
Wenn Sie den Python-Interpreter von einer Shell unter Linux oder ähnlichen Systemen starten (BSD, nicht sicher über Mac), sollten Sie auch die Standardcodierung für die Shell überprüfen.
Rufen Sie
locale charmap
von der Shell aus (nicht vom Python-Interpreter) und Sie sollten sehenWenn dies nicht der Fall ist und Sie etwas anderes sehen, z
Python erbt (zumindest in einigen Fällen wie in meinem) die Codierung der Shell und kann keine (einige? Alle?) Unicode-Zeichen drucken. Pythons eigene Standardcodierung, die Sie über
sys.getdefaultencoding()
und sehen und steuernsys.setdefaultencoding()
die in diesem Fall ignoriert wird.Wenn Sie feststellen, dass Sie dieses Problem haben, können Sie es durch beheben
(Oder wählen Sie alternativ die gewünschte Keymap anstelle von en_EN.) Sie können auch bearbeiten
/etc/locale.conf
(oder die Datei, die die Gebietsschema-Definition in Ihrem System regelt), um dies zu korrigieren.quelle