491 Stimmen

UnicodeDecodeError, ungültiges Fortsetzungsbyte

Warum funktioniert der unten stehende Punkt nicht? Warum funktioniert es mit dem Codec "latin-1"?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

Daraus ergibt sich:

 Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte

562voto

Mazen Aly Punkte 4865

Ich hatte den gleichen Fehler, als ich versucht habe, eine CSV-Datei zu öffnen, indem ich pandas.read_csv Methode.

Die Lösung war die Änderung der Kodierung in latin-1 :

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')

363voto

Josh Lee Punkte 159535

Im Binärformat sieht 0xE9 wie folgt aus 1110 1001 . Wenn Sie lesen über UTF-8 auf Wikipedia sehen Sie, dass auf ein solches Byte zwei Bytes der folgenden Form folgen müssen 10xx xxxx . Also, zum Beispiel:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

Aber das ist nur die mechanische Ursache für diese Ausnahme. In diesem Fall haben Sie eine Zeichenkette, die mit ziemlicher Sicherheit in Latin 1 kodiert ist. Sie können sehen, wie unterschiedlich UTF-8 und Latin 1 aussehen:

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(Hinweis: Ich verwende hier eine Mischung aus Python 2 und 3. Die Eingabe ist in jeder Python-Version gültig, aber es ist unwahrscheinlich, dass Ihr Python-Interpreter sowohl Unicode- als auch Byte-Strings auf diese Weise darstellt).

77voto

Sami J. Lehtinen Punkte 989

Es ist ungültig UTF-8. Dieses Zeichen ist das e-acute-Zeichen in ISO-Latin1, weshalb es mit diesem Codesatz erfolgreich ist.

Wenn Sie den Codesatz nicht kennen, in dem Sie Zeichenketten empfangen, haben Sie ein kleines Problem. Am besten wäre es, wenn ein einziger Codesatz (hoffentlich UTF-8) für Ihr Protokoll/Ihre Anwendung gewählt würde und Sie dann nur diejenigen zurückweisen würden, die nicht decodiert werden können.

Wenn Sie das nicht können, brauchen Sie Heuristiken.

54voto

neurino Punkte 10642

Da UTF-8 ein Multibyte-Format ist und es kein Zeichen gibt, das Ihrer Kombination von \xe9 plus folgenden Platz.

Warum sollte es gelingen beide utf-8 und latin-1?

Hier, wie derselbe Satz in utf-8 aussehen sollte:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'

30voto

Verwenden Sie dies, wenn der Fehler UTF-8 angezeigt wird

pd.read_csv('File_name.csv',encoding='latin-1')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X