Werken met unicode in python

Ik maak verbinding met een mysql-database met behulp van pymysql en na het uitvoeren van een verzoek kreeg ik de volgende tekenreeks: \ xd0 \ xbc \ xd0 \ xb0 \ xd1 \ x80 \ xd0 \ xba \ xd0 \ xb0 .

Dit zou 5 tekens in utf8 moeten zijn, maar als ik print s.encode ('utf-8') krijg ik dit: ╨╝╨░╤А╨║╨░ . De tekenreeks lijkt op byte-weergave van Unicode-tekens, die Python niet herkent.

Dus wat moet ik doen om Python goed te laten verwerken?

2

2 antwoord

U wilt decoderen (niet coderen ) om een ​​unicode-tekenreeks uit een byte-tekenreeks te krijgen.

>>> s = '\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0'
>>> us = s.decode('utf-8')
>>> print us
марка

Merk op dat u het mogelijk niet kunt afdrukken omdat het tekens buiten ASCII bevat. Maar je zou de waarde ervan moeten kunnen zien in een Unicode-bewuste debugger. Ik heb het bovenstaande in IDLE uitgevoerd.

Bijwerken

Het lijkt erop dat dit het volgende is:

>>> s = u'\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0'

Dit is lastiger omdat je die bytes eerst in een bytestring moet krijgen voordat je decode aanroept. Ik weet niet zeker wat de "beste" manier is om dit te doen, maar dit werkt:

>>> us = ''.join(chr(ord(c)) for c in s).decode('utf-8')
>>> print us
марка

Merk op dat je het natuurlijk moet decoderen voordat je het in de database opslaat als een string.

5
toegevoegd
Dank je. Toen ik decoderen probeerde, kreeg ik de foutmelding "UnicodeEncodeError: 'ascii' codec kan tekens op positie 0-9 niet coderen: ordinaal niet binnen bereik (128)". Moet zijn omdat de tekenreeks werd weergegeven als u \ xd0 \ xbc \ xd0 \ xb0 \ xd1 \ x80 \ xd0 \ xba \ xd0 \ xb0
toegevoegd de auteur Alexander Egurnov, de bron
print s.encode ('latin1'). decode ('utf8') werkte ook voor mij.
toegevoegd de auteur Alexander Egurnov, de bron

Mark heeft gelijk: je moet de string decoderen. Byte-strings worden Unicode-reeksen door ze te decoderen, coderen gaat de andere kant op. Deze en vele andere details staan ​​op Pragmatic Unicode of, How Do I Stop The Pain? .

4
toegevoegd
Ik ben hier in het verleden fout van geworden - en probeer alleen te onthouden dat een "decodeert" bytes, maar "codeert" de tekst.
toegevoegd de auteur Jon Clements, de bron