_Exact_ Äquivalent von 'b' ... '.decode ("utf-8", "backslashreplace") in Python 2

8

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

%Vor%

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.)

    
zwol 17.03.2017, 14:32
quelle

2 Antworten

2

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%
    
Mark Tolonen 23.04.2017 20:46
quelle
2

Ich habe einen umfassenderen Backport der cpython-Implementierung

versucht >

Dies betrifft sowohl UnicodeDecodeError (von .decode() ) als auch UnicodeEncodeError von .encode() und UnicodeTranslateError von .translate() :

%Vor%     
Anthony Sottile 20.09.2017 03:14
quelle