399 Stimmen

UnicodeDecodeError: 'utf8' Codec kann Byte 0x9c nicht dekodieren

Ich habe einen Socket-Server, der UTF-8 gültige Zeichen von Clients empfangen soll.

Das Problem ist, dass einige Kunden (vor allem Hacker) die falsche Art von Daten über das Netz senden.

Ich kann den echten Kunden leicht erkennen, aber ich speichere alle gesendeten Daten in Dateien, damit ich sie später analysieren kann.

Manchmal erhalte ich Zeichen wie dieses œ die die Ursache für die UnicodeDecodeError Fehler.

Ich muss in der Lage sein, die Zeichenfolge UTF-8 mit oder ohne diese Zeichen zu machen.


Aktualisierung:

In meinem speziellen Fall war der Socket-Dienst ein MTA und daher erwarte ich nur ASCII-Befehle wie z. B.:

EHLO example.com
MAIL FROM: <john.doe@example.com>
...

Ich habe all dies in JSON protokolliert.

Dann beschlossen einige Leute, die keine guten Absichten hatten, alle möglichen Arten von Müll zu schicken.

Deshalb ist es für meinen speziellen Fall völlig in Ordnung, die Nicht-ASCII-Zeichen zu entfernen.

444voto

transilvlad Punkte 13016

http://docs.python.org/howto/unicode.html#the-unicode-type

str = unicode(str, errors='replace')

oder

str = unicode(str, errors='ignore')

Anmerkung: Dadurch werden die fraglichen Zeichen entfernt (ignoriert) und die Zeichenkette ohne sie zurückgegeben.

Für mich ist dies der ideale Fall, da ich es als Schutz gegen Nicht-ASCII-Eingaben verwende, die in meiner Anwendung nicht zulässig sind.

Alternativ dazu: Verwenden Sie die Methode open aus der codecs Modul, um die Datei einzulesen:

import codecs
with codecs.open(file_name, 'r', encoding='utf-8',
                 errors='ignore') as fdata:

136voto

Doğuş Punkte 1837

Die Umstellung der Engine von C auf Python hat mir geholfen.

Motor ist C:

pd.read_csv(gdp_path, sep='\t', engine='c')

'utf-8' Codec kann Byte 0x92 an Position 18 nicht dekodieren: ungültiges Startbyte

Der Motor ist Python:

pd.read_csv(gdp_path, sep='\t', engine='python')

Keine Fehler für mich.

82voto

James McCormac Punkte 1477

Diese Art von Problem taucht für mich jetzt auf, dass ich zu Python 3 bewegt habe. Ich hatte keine Ahnung, Python 2 war einfach Dampf rollen alle Probleme mit Datei-Codierung.

Ich fand diese nette Erklärung der Unterschiede und wie man eine Lösung findet, nachdem keine der oben genannten Lösungen bei mir funktioniert hat.

http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html

Kurz gesagt, damit sich Python 3 so ähnlich wie möglich wie Python 2 verhält:

with open(filename, encoding="latin-1") as datafile:
    # work on datafile here

Aber lesen Sie den Artikel, es gibt keine Einheitslösung für alle.

43voto

Ivan Lee Punkte 3080

Die erste, mit get_encoding_type, um den Codierungstyp der Dateien zu ermitteln:

import os    
from chardet import detect

# get file encoding type
def get_encoding_type(file):
    with open(file, 'rb') as f:
        rawdata = f.read()
    return detect(rawdata)['encoding']

die zweite, das Öffnen der Dateien mit dem Typ:

open(current_file, 'r', encoding = get_encoding_type, errors='ignore')

38voto

>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ

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