2012-10-13 57 views
0

我想對Python的使用SQLite的工作:編碼再次

from pysqlite2 import dbapi2 as sqlite 
con = sqlite.connect('/home/argon/super.db') 
cur = con.cursor() 
cur.execute('select * from notes') 
for i in cur.fetchall(): 
    print i[2] 

有時候,我得到這樣的事情(我是從俄羅斯):

Ответ etc... 

如果我通過這個字符串這個功能(它幫助我在其他項目中):

def unescape(text): 
    def fixup(m): 
     text = m.group(0) 
     if text[:2] == "&#": 
      # character reference 
      try: 
       if text[:3] == "&#x": 
        return unichr(int(text[3:-1], 16)) 
       else: 
        return unichr(int(text[2:-1])) 
      except ValueError: 
       pass 
     else: 
      # named entity 
      try: 
       text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) 
      except KeyError: 
       pass 
     return text # leave as is 
    return re.sub("&#?\w+;", fixup, text) 

我得到更加怪異的結果:

ÐÑвеÑиÑÑ Ñ ÑиÑиÑованием etc 

我該怎麼做才能得到正常的西里爾符號?

回答

1

О對於\xD0\x9E\u1054看起來像UTF-8字節對。更好地稱爲西里爾字符О(Capital O)。

換句話說,你奇怪地編碼了你手上的UTF-8數據。將{數字轉換爲字節(chr(208)會做)然後從UTF-8解碼:

>>> (chr(208) + chr(158)).decode('utf-8') 
u'\u1054' 
>>> print (chr(208) + chr(158)).decode('utf-8') 
О 
>>> print (chr(208) + chr(158) + chr(209) + chr(130) + chr(208) + chr(178)).decode('utf-8') 
Отв