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.

30voto

maiky_forrester Punkte 598

Ich hatte dasselbe Problem mit UnicodeDecodeError und ich habe es mit dieser Zeile gelöst. Ich weiß nicht, ob es der beste Weg ist, aber es funktionierte für mich.

str = str.decode('unicode_escape').encode('utf-8')

19voto

Talha Rasool Punkte 1044

Diese Lösung eignet sich gut für lateinamerikanische Akzente, wie z. B. 'ñ'.

Ich habe dieses Problem gelöst, indem ich einfach Folgendes hinzugefügt habe

df = pd.read_csv(fileName,encoding='latin1')

3voto

http8086 Punkte 864

Nur für den Fall, dass jemand das gleiche Problem hat. Ich verwende vim mit YouCompleteMe , konnte ycmd mit dieser Fehlermeldung nicht starten, was ich getan habe, ist: export LC_CTYPE="en_US.UTF-8" ist das Problem behoben.

2voto

Was können Sie tun, wenn Sie eine Datei ändern müssen, aber die Kodierung der Datei nicht kennen? Wenn Sie wissen, dass die Kodierung ASCII-kompatibel ist und Sie nur die ASCII-Teile untersuchen oder ändern möchten, können Sie die Datei mit dem Surrogateescape-Fehlerbehandlungsprogramm öffnen:

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

1voto

tripleee Punkte 155951

Wenn Sie, wie Sie sagen, nur reines 7-Bit-ASCII zulassen wollen, verwerfen Sie einfach alle Bytes, die das nicht sind. Ohne eine explizit angegebene Kodierung gibt es keinen einfachen Weg, um zu erraten, was die Gegenseite mit diesen Bytes darstellen wollte.

while bytes := socket.read_line_bytes():
    try:
        string = bytes.decode('us-ascii')
    except UnicodeDecodeError as exc:
        logger.warning('[%s] - rejected non-ASCII input %s' % (client, bytes.decode('us-ascii',  errors='backslashreplace'))
        socket.write(b'421 communication error - non-ASCII content rejected\r\n')
        continue
    ...

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