/ / Python2: Die Verwendung von .decode with errors = 'replace' gibt immer noch Fehler zurück - Python, Python-2.7, Unicode, Zeichencodierung

Python2: Die Verwendung von .decode with errors = 'replace' gibt immer noch Fehler zurück - Python, Python-2.7, Unicode, Zeichencodierung

Also ich habe eine message die aus einer Datei unbekannter Kodierung gelesen wird. Ich möchte zur Anzeige an eine Webseite senden. Ich habe mich viel mit UnicodeErrors auseinandergesetzt und viele Fragen und Antworten zu StackOverflow durchlaufen. Ich glaube, ich habe ein gutes Verständnis dafür, wie Unicode und die Kodierung funktionieren. Mein aktueller Code sieht so aus

try :
return message.decode(encoding="utf-8")
except:
try:
return message.decode(encoding="latin-1")
except:
try:
print("Unable to entirely decode in latin or utf-8, will replace error characters with "?"")
return message.decode(encoding="utf-8", errors="replace")

Die zurückgegebene Nachricht wird dann in einem JSON-Speicher abgelegt und an das Frontend gesendet.

Ich habe das angenommen, weil ich es benutze errors="replace"am letzten try except dass ich Ausnahmen vermeiden würde auf Kosten einiger "?" Zeichen in meiner Anzeige. Ein akzeptabler Preis.

Es scheint jedoch, dass ich zu hoffnungsvoll war, und für einige Dateien bekomme ich immer noch eine UnicodeDecodeException sagen, "ASCII-Codecs können nicht decodieren" für einige Zeichen. Warum nicht? errors="replace" kümmere dich einfach um das?

(Auch als Bonusfrage, was hat das Ascii mit irgendetwas zu tun? .. Ich spezifiziere utf-8)

Antworten:

1 für die Antwort № 1

Sie sollten keine bekommen UnicodeDecodeError mit errors="replace". Ebenfalls str.decode("latin-1") sollte niemals scheitern, da ISO-8859-1 für jede mögliche Bytefolge eine gültige Zeichenzuordnung hat.

Mein Verdacht ist das message ist schon ein unicode Zeichenfolge, nicht Bytes. Unicode-Text wurde bereits von Bytes „dekodiert“ und kann nicht mehr

Wenn du anrufst .decode() ein a unicode Zeichenfolge, Python 2 versucht, hilfreich zu sein und entscheidet sich dafür kodieren die Unicode-Zeichenfolge in Byte zurück (unter Verwendung der Standardkodierung), damit Sie etwas haben, das Sie wirklich dekodieren können. Dieser implizite Codierschritt tut nicht benutzen errors="replace"Wenn also in der Unicode - Zeichenfolge Zeichen enthalten sind, die nicht in der Standardcodierung (wahrscheinlich ASCII) enthalten sind, erhalten Sie eine UnicodeEncodeError.

(Python 3 macht dies nicht mehr, da es fürchterlich verwirrend ist.)

Überprüfen Sie den Typ von message und vorausgesetzt es ist in der Tat Unicode, arbeiten Sie von dort zurück, um herauszufinden, wo es (möglicherweise implizit) decodiert wurde, um dies durch die korrekte Decodierung zu ersetzen.


0 für die Antwort № 2

Mit Fehlerdecodierung ersetzen implementiert die Fehlerbehandlung "Ersetzen" (für Textkodierungen nur): ersetzt "?" für Codierungsfehler (vom Codec codiert zu werden) und "ufffd" (das Unicode-Ersatzzeichen) für Decodierungsfehler

Textcodierung bedeutet "Codec, der Unicode-Zeichenfolgen in Bytes codiert"

Ihre Daten sind möglicherweise fehlerhaft - Sie sollten versuchen, die Fehlerbehandlung zu "ignorieren", wenn fehlerhafte Daten ignoriert werden und das Kodieren oder Dekodieren ohne weitere Benachrichtigung fortgesetzt wird.

message.decode(encoding="utf-8", errors="ignore")