Ich habe einen Socket-Server, der gültige UTF-8-Zeichen von Clients empfangen soll.
Das Problem ist, dass einige Clients (hauptsächlich Hacker) die falschen Daten darüber senden.
Ich kann den echten Client leicht unterscheiden, aber ich protokolliere alle gesendeten Daten in Dateien, damit ich sie später analysieren kann.
Manchmal bekomme ich solche Zeichen œ
, die den UnicodeDecodeError
Fehler verursachen.
Ich muss in der Lage sein, die Zeichenfolge UTF-8 mit oder ohne diese Zeichen zu erstellen.
Aktualisieren:
Für meinen speziellen Fall war der Socket-Dienst ein MTA und daher erwarte ich nur ASCII-Befehle wie:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
Ich habe das alles in JSON protokolliert.
Dann beschlossen einige Leute da draußen ohne gute Absichten, alle Arten von Müll zu verkaufen.
Aus diesem Grund ist es für meinen speziellen Fall vollkommen in Ordnung, die Nicht-ASCII-Zeichen zu entfernen.
quelle
Antworten:
http://docs.python.org/howto/unicode.html#the-unicode-type
oder
Hinweis: Dadurch werden die betreffenden Zeichen entfernt (ignoriert) und die Zeichenfolge ohne sie zurückgegeben.
Für mich ist dies ein idealer Fall, da ich es als Schutz gegen Nicht-ASCII-Eingaben verwende, die von meiner Anwendung nicht zugelassen werden.
Alternativ: Verwenden Sie die Methode open aus dem
codecs
Modul, um die Datei einzulesen:quelle
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
der sichu'\ufffdmsterdam'
mit replaceopen(file_name, "rb")
und dann Bens Ansatz aus den obigen Kommentaren anwendenDas Ändern der Engine von C auf Python hat den Trick für mich getan.
Motor ist C:
Engine ist Python:
Keine Fehler für mich.
quelle
csv
Datei haben. Dies kann zu einemOutOfMemory
Fehler oder einem automatischen Neustart des Kernels Ihres Notebooks führen. Sie sollten dasencoding
auf diesen Fall einstellen .Diese Art von Problem tritt für mich jetzt auf, da ich zu Python 3 gewechselt bin. Ich hatte keine Ahnung, dass Python 2 einfach Probleme mit der Dateicodierung mit Dampf rollt.
Ich fand diese nette Erklärung der Unterschiede und wie man eine Lösung findet, nachdem keines der oben genannten für mich funktioniert hat.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Kurz gesagt, um Python 3 so ähnlich wie möglich zu Python 2 zu verhalten, verwenden Sie:
Lesen Sie jedoch den Artikel, es gibt keine Einheitslösung.
quelle
quelle
used by default in the legacy components of Microsoft Windows in English and some other Western languages
Ich hatte das gleiche Problem mit
UnicodeDecodeError
und habe es mit dieser Zeile gelöst. Ich weiß nicht, ob das der beste Weg ist, aber es hat bei mir funktioniert.quelle
Das erste ist Verwenden von get_encoding_type, um den Dateityp der Codierung abzurufen:
das zweite, Öffnen der Dateien mit dem Typ:
quelle
Nur für den Fall, dass jemand das gleiche Problem hat. Ich verwende vim mit YouCompleteMe und konnte ycmd nicht mit dieser Fehlermeldung starten. Ich habe Folgendes getan:
export LC_CTYPE="en_US.UTF-8"
Das Problem ist behoben.quelle
export LC_CTYPE="en_US.UTF-8"
?Was können Sie tun, wenn Sie Änderungen an einer Datei vornehmen müssen, aber die Codierung der Datei nicht kennen? Wenn Sie wissen, dass die Codierung ASCII-kompatibel ist und nur die ASCII-Teile untersuchen oder ändern möchten, können Sie die Datei mit dem Surrogateescape-Fehlerbehandler öffnen:
quelle
Ich habe dieses Problem nur durch Hinzufügen gelöst
quelle