sql >> Database >  >> RDS >> PostgreSQL

UnicodeDecodeError:'ascii'-codec kan byte 0x92 op positie 47 niet decoderen:ordinaal niet binnen bereik (128)

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.




  1. PLS-00539 en PLS-00538 fouten bij het maken van UDT-functies

  2. Versleutel gegevens in SQLite

  3. Een gebruiker aanmaken op MySQL

  4. Maak een scalaire door de gebruiker gedefinieerde functie in SQL Server