Het probleem is dat je encode
. belt op een str
voorwerp.
Een str
is een bytetekenreeks, die meestal tekst vertegenwoordigt die op de een of andere manier is gecodeerd, zoals UTF-8. Wanneer je encode
aanroept daarop moet het eerst terug naar tekst worden gedecodeerd, zodat de tekst opnieuw kan worden gecodeerd. Standaard doet Python dat door s.decode(sys.getgetdefaultencoding())
aan te roepen , en getdefaultencoding()
retourneert meestal 'ascii'
.
Dus je hebt het over UTF-8-gecodeerde tekst, decodeert het alsof het ASCII is en codeert het vervolgens opnieuw in UTF-8.
De algemene oplossing is om expliciet decode
. aan te roepen met de juiste codering, in plaats van Python de standaard te laten gebruiken, en dan encode
het resultaat.
Maar als de juiste codering al degene is die u wilt, is de eenvoudigere oplossing om de .decode('utf-8').encode('utf-8')
over te slaan. en gebruik gewoon de UTF-8 str
als de UTF-8 str
dat het al is.
Of, als alternatief, als uw MySQL-wrapper een functie heeft waarmee u een codering kunt opgeven en unicode
kunt terugkrijgen waarden voor CHAR
/VARCHAR
/TEXT
kolommen in plaats van str
waarden (bijv. in MySQLdb geeft u use_unicode=True
door naar de connect
oproep, of charset='UTF-8'
als uw database te oud is om deze automatisch te detecteren), doet u dat gewoon. Dan heb je unicode
objecten, en u kunt .encode('utf-8')
. aanroepen op hen.
Over het algemeen is de beste manier om met Unicode-problemen om te gaan de laatste:decodeer alles zo vroeg mogelijk, doe alle verwerking in Unicode en codeer dan zo laat mogelijk. Maar hoe dan ook, je moet consequent zijn. Bel niet str
op iets dat een unicode
. kan zijn; voeg geen str
samen letterlijk naar een unicode
of geef er een door aan zijn replace
methode; enz. Elke keer dat je mixt en matcht, zal Python impliciet voor je converteren, met je standaardcodering, wat bijna nooit is wat je wilt.
Even terzijde:dit is een van de vele dingen waar de Unicode-wijzigingen van Python 3.x bij helpen. Ten eerste, str
is nu Unicode-tekst, geen gecodeerde bytes. Wat nog belangrijker is, als je hebt gecodeerde bytes, bijvoorbeeld in een bytes
object, aanroepend encode
geeft u een AttributeError
in plaats van stil te proberen te decoderen, zodat het opnieuw kan coderen. En op dezelfde manier zal het proberen om Unicode en bytes te mixen en matchen je een voor de hand liggende TypeError
geven , in plaats van een impliciete conversie die in sommige gevallen slaagt en een cryptische boodschap geeft over een codering of decodering waar u in andere niet om heeft gevraagd.