In Python 3.5+ .decode("utf-8", "backslashreplace")
ist eine ziemlich gute Option für den Umgang mit teilweise-Unicode, teilweise-einige-unbekannten-Legacy-kodierenden Binär-Strings. Gültige UTF-8-Sequenzen werden dekodiert und ungültige werden als Escape-Sequenzen beibehalten. Zum Beispiel
Dadurch wird die Unterscheidung zwischen b'\xc2\xa1\xa1'
und b'\xc2\xa1\xa1'
verloren, aber wenn Sie in der "nur mich etwas nicht zu verlustreich, dass ich später von Hand reparieren kann" Geisteshaltung , das ist wahrscheinlich in Ordnung.
Dies ist jedoch eine neue Funktion in Python 3.5. Das Programm, an dem ich arbeite, muss auch 3.4 und 2.7 unterstützen. In diesen Versionen wird eine Ausnahme ausgelöst:
%Vor%Ich habe eine Annäherung gefunden, aber kein exaktes Äquivalent:
%Vor%Es ist sehr wichtig, dass das Verhalten nicht von der Version des Interpreters abhängt. Kann jemand einen Weg empfehlen, genau das Verhalten von Python 3.5 in 2.7 und 3.4 zu bekommen?
(Ältere Versionen von 2.x oder 3.x müssen nicht funktionieren. Affe-Patching codecs
ist absolut akzeptabel.)
Sie können Ihren eigenen Fehlerhandler schreiben. Hier ist eine Lösung, die ich auf Python 2.7, 3.3 und 3.6 getestet habe:
%Vor%Ausgabe:
%Vor%
Ich habe einen umfassenderen Backport der cpython-Implementierung
versucht > Dies betrifft sowohl UnicodeDecodeError
(von .decode()
) als auch UnicodeEncodeError
von .encode()
und UnicodeTranslateError
von .translate()
:
Tags und Links python encoding python-3.x python-2.7 backwards-compatibility