webentwicklung-frage-antwort-db.com.de

Python ASCII und Unicode-Decodierungsfehler

Ich habe diesen sehr frustrierenden Fehler beim Einfügen einer bestimmten Zeichenfolge in meine Datenbank erhalten. Es sagte so etwas wie:

Python kann keine Bytezeichen decodieren und erwartet Unicode. " 

Nach langem Suchen sah ich, dass ich diesen Fehler durch Codieren meiner Zeichenfolge in Unicode überwinden konnte. Ich versuche dies, indem ich zuerst den String decodiere und ihn dann im UTF-8 -Format codiere. Mögen:

string = string.encode("utf8")

Und ich erhalte folgende Fehlermeldung:

'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

Ich habe mit diesem Fehler gestorben! Wie kann ich das beheben?

14
Amitash

BEARBEITEN: Wie Sie den Downvotes entnehmen können, ist dies NICHT der beste Weg, dies zu tun. Eine ausgezeichnete und dringend empfohlene Antwort ist unmittelbar danach. Wenn Sie also nach einer guten Lösung suchen, verwenden Sie diese bitte. Dies ist eine hackhafte Lösung, die Ihnen zu einem späteren Zeitpunkt nicht liebenswürdig sein wird.

Ich fühle deine Schmerzen, ich hatte viele Probleme mit dem gleichen Fehler. Der einfachste Weg, den ich gelöst habe (und dies ist möglicherweise nicht der beste Weg, der von Ihrer Anwendung abhängt) bestand darin, die Dinge in Unicode zu konvertieren und Fehler zu ignorieren. Hier ist ein Beispiel aus Unicode HOWTO - Python v2.7.3 Dokumentation

>>> unicode('\x80abc', errors='strict')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
                    ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'

Dies ist zwar nicht die sinnvollste Methode, aber für mich hat sich diese Methode bewährt.

BEARBEITEN:

Ein paar Leute in den Kommentaren haben erwähnt, dass dies eine schlechte Idee ist, obwohl der Fragesteller die Antwort akzeptiert hat. Es ist NICHT eine großartige Idee, es wird alles vermasseln, wenn Sie mit europäischen und akzentuierten Charakteren zu tun haben. Dies ist jedoch etwas, das Sie verwenden können, wenn es sich nicht um einen Code auf Produktionsniveau handelt, wenn Sie ein persönliches Projekt sind, an dem Sie arbeiten, und Sie eine schnelle Lösung benötigen, um die Dinge ins Rollen zu bringen. Sie müssen es eventuell mit den richtigen Methoden beheben, die in den folgenden Antworten erwähnt werden.

4

Sie müssen diszipliniert vorgehen. Pragmatischer Unicode oder wie höre ich die Schmerzen auf? hat alles was du brauchst.

Wenn Sie diesen Fehler in dieser Codezeile erhalten, besteht das Problem darin, dass string eine Byte-Zeichenfolge ist und Python 2 implizit versucht, sie für Sie in Unicode zu decodieren. Aber es ist kein reines Ascii. Sie müssen wissen, was die Kodierung ist, und sie richtig dekodieren.

49
Ned Batchelder

Die encode-Methode sollte für unicode-Objekte verwendet werden, um sie mit einer bestimmten Kodierung in ein str-Objekt zu konvertieren. Die decode-Methode sollte für str-Objekte einer bestimmten Codierung verwendet werden, um diese unicode-Objekte zu konvertieren.

Ich nehme an, dass Ihre Datenbank Zeichenketten in UTF-8 speichert. Wenn Sie also Zeichenfolgen aus der Datenbank abrufen, konvertieren Sie sie in unicode-Objekte, indem Sie str.decode('utf-8') ausführen. Verwenden Sie dann nur unicode-Objekte in Ihrem Python-Programm (Literale werden mit u'unicode string' definiert). Bevor Sie sie in Ihrer Datenbank speichern, konvertieren Sie sie mit uni.encode('utf-8') in str-Objekte.

12

Der 0xE3-Codepunkt ist ein "a" mit einer Tilde in Unicode. Ihre ursprüngliche Zeichenfolge ist höchstwahrscheinlich bereits in UTF-8 enthalten, sodass Sie sie nicht mit dem Standard-Zeichensatz ASCII dekodieren können.

2
Silas Ray

string in Python 2.7 ist eine ecodierte Zeichenfolge (meist in ASCII codiert), jedoch keine Zeichenfolge oder Unicode.

Wenn Sie also string.encode ('some encoding') machen, codieren Sie tatsächlich eine codierte Zeichenfolge (mit etwas Codierung).

Python muss diese Zeichenfolge zuerst mit der Standardcodierung (ASCII in Python 2.7) decodieren und dann weiter .. .. Ihre Zeichenfolge wird nicht in ASCII, sondern in einer anderen Codierung (UTF8, LATIN-1 ..) codiert. Wenn Python versucht, dies mit ASCII zu decodieren, wird ein Fehler ausgegeben, da der Codec ASCII nicht einige Zeichen in der angegebenen Zeichenfolge decodieren kann, die außerhalb des Bereichs ASCII (0 - 127) liegen.

#to encode above given string, first decode that using some encoding
decoded_string = string.decode('utf8')
#now encode that decoded string
decoded_string.encode('utf8')
0
keshav