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.