PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

UnicodeDecodeError:„ASCII“-Codec kann Byte 0x92 in Position 47 nicht decodieren:Ordnungszahl nicht im Bereich (128)

Das Problem ist, dass Sie encode aufrufen auf einem str Objekt.

Ein str ist ein Byte-String, der normalerweise Text darstellt, der in irgendeiner Weise wie UTF-8 codiert ist. Wenn Sie encode aufrufen Dazu muss es zunächst wieder in Text dekodiert werden, damit der Text erneut kodiert werden kann. Standardmäßig tut Python dies, indem es s.decode(sys.getgetdefaultencoding()) aufruft und getdefaultencoding() gibt normalerweise 'ascii' zurück .

Sie sprechen also von UTF-8-codiertem Text, decodieren ihn, als wäre er ASCII, und codieren ihn dann erneut in UTF-8.

Die allgemeine Lösung besteht darin, explizit decode aufzurufen mit der richtigen Codierung, anstatt Python den Standard verwenden zu lassen, und dann encode das Ergebnis.

Aber wenn die richtige Codierung bereits die gewünschte ist, besteht die einfachere Lösung darin, einfach .decode('utf-8').encode('utf-8') zu überspringen und verwenden Sie einfach den UTF-8 str als UTF-8 str dass es schon ist.

Oder alternativ, wenn Ihr MySQL-Wrapper über eine Funktion verfügt, mit der Sie eine Codierung angeben und unicode zurückerhalten können Werte für CHAR /VARCHAR /TEXT Spalten statt str Werte (z. B. übergeben Sie in MySQLdb use_unicode=True zum connect Aufruf oder charset='UTF-8' wenn Ihre Datenbank zu alt ist, um sie automatisch zu erkennen), tun Sie das einfach. Dann haben Sie unicode Objekte, und Sie können .encode('utf-8') aufrufen auf ihnen.

Im Allgemeinen ist der letzte Weg, mit Unicode-Problemen umzugehen, der beste Weg – alles so früh wie möglich dekodieren, die gesamte Verarbeitung in Unicode durchführen und dann so spät wie möglich kodieren. Aber so oder so, man muss konsequent sein. Rufen Sie nicht str auf auf etwas, das ein unicode sein könnte; Verketten Sie keinen str Literal zu einem unicode oder übergeben Sie eines an seinen replace Methode; usw. Jedes Mal, wenn Sie mischen und anpassen, konvertiert Python implizit für Sie und verwendet Ihre Standardcodierung, was fast nie das ist, was Sie wollen.

Als Randnotiz ist dies eines der vielen Dinge, bei denen die Unicode-Änderungen von Python 3.x helfen. Zuerst str ist jetzt Unicode-Text, nicht codierte Bytes. Noch wichtiger, wenn Sie haben codierte Bytes, z. B. in bytes Objekt, das encode aufruft gibt Ihnen einen AttributeError anstatt zu versuchen, still zu decodieren, damit es neu codiert werden kann. Und in ähnlicher Weise führt der Versuch, Unicode und Bytes zu mischen und abzugleichen, zu einem offensichtlichen TypeError , anstelle einer impliziten Konvertierung, die in einigen Fällen erfolgreich ist und eine kryptische Nachricht über eine Codierung oder Decodierung liefert, die Sie in anderen Fällen nicht angefordert haben.