2012-06-24 34 views
2

我使用pymysql連接到mysql數據庫,並在執行請求後獲得以下字符串:\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0在python中使用unicode

這應該是5個字符在utf8中,但是當我做print s.encode('utf-8')我得到這個:╨╝╨░╤А╨║╨░。該字符串看起來像unicode字符的字節表示,python無法識別。

那麼我該怎麼做才能讓python正確處理它們?

回答

5

你想要decode(而不是encode)從字節字符串中獲取一個Unicode字符串。

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

請注意,您可能無法print它,因爲它包含ASCII以外的字符。但是你應該能夠在一個支持Unicode的調試器中看到它的價值。我在IDLE中運行了上面的代碼。

更新

看來你確實有這是什麼:

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

這是棘手的,因爲你首先要獲得這些字節到一個字節串打電話decode之前。我不知道什麼是「最好」的方式做到這一點,但這一點在作品:

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

請注意,您當然應該解碼它,你把它存儲在數據庫中的字符串之前。

+0

謝謝。當我嘗試解碼時,我得到一個錯誤,說「UnicodeEncodeError:'ascii'編解碼器無法編碼位置0-9的字符:序號不在範圍(128)」。 ('latin1')。decode('utf8')'必須是因爲該字符串被表示爲'u \ xd0 \ xbc \ xd0 \ xb0 \ xd1 \ x80 \ xd0 \ xba \ xd0 \ xb0' –

+0

'print s.encode也爲我工作。 –

4

馬克是正確的:你需要解碼字符串。字節字符串通過對它們進行解碼成爲Unicode字符串,編碼以其他方式進行。這和其他許多細節在Pragmatic Unicode, or, How Do I Stop The Pain?

+0

我在過去犯了這個錯誤,只是試着記住一個「解碼」字節,但是「編碼」文本。 –