2012-10-13 59 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') 
Отв