从远程数据库获取UTF8字符串
我的应用程序从远程的MySQL数据库下载一些数据。问题是数据库里的字符串是用utf8格式存储的。但是我收到的数据是ascii格式的。该怎么解决这个问题呢?
代码如下:
cursor = conn.cursor()
query = """MY QUERY HERE"""
cursor.execute(query)
result = cursor.fetchall()
4 个回答
0
在从数据库查询之前,先执行 conn.set_character_encoding('utf8')
这个命令。
0
你可以试试这个方法:string.encode('ascii').decode('utf-8')
?
2
也许举个例子会更清楚——在这里我创建了一个unicode字符串“u”,然后把它编码成utf8格式,再从utf8解码回unicode字符串,接着再把它编码成ascii格式(这会出错,因为这个字符串里的扩展字符不能用ascii编码),最后再把它编码成ascii格式,并用“?”替代错误的部分:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:43:55)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> u = u'abc\u2020123'
>>> u
u'abc\u2020123'
>>> u.encode('utf8')
'abc\xe2\x80\xa0123'
>>> s = _
>>> s.decode('utf8')
u'abc\u2020123'
>>> u.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2020' in position 3: ordinal not in range(128)
>>> u.encode('ascii', 'replace')
'abc?123'
>>>
假设你从数据库里拿到的是utf8字符串,你应该先把这些字符串从utf8解码成unicode字符串,然后在输出的时候可能还需要重新编码,以适应你的程序输出的内容……通常你想要的流程大概是这样的:
- 输入数据——把输入的编码转换成unicode [string.decode('utf8')]
- 处理数据——只处理unicode对象
- 输出结果——把unicode转换成输出编码 [string.encode('utf8')]
这样做可以让编码和解码的过程清晰分开,避免在你的应用程序中到处都是处理编码的代码,因为核心部分只处理unicode。