我连接到MySQL并检索包含'Ö','ğ','Ş'等的用户名。 它适用于MySQL或PHP,但在Python 2.6.8中,会发生错误。 这是我的代码:
#C:\Python27\Lib\encodings
#-*- coding: utf-8 -*-
conn = MySQLdb.Connect(host="localhost", user="root", passwd="mypass", db="mydb", charset="utf8", init_command="SET NAMES UTF8")
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("select * from users");
tmpDict=cursor.fetchallDict()
print tmpDict[0]['NAME'].decode('utf8')
我希望'ÖmerŞirin'在这里,但我得到以下错误:
'ascii'编解码器无法对位置0中的字符u'\ xd6'进行编码:序数不在范围内(128)
我该如何解决这个问题?
答案 0 :(得分:2)
有两个错误和两个问题:
如果[PFTwitterUtils...]
那么第二个问题可以轻松复制:
type(tmpDict[0]['NAME']) == unicode
发生的事情是>>> u'\xd6'.decode('utf-8') #XXX BROKEN, DO NOT DO IT!!!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xd6' in position 0: ordinal not in range(128)
已经是一个Unicode字符串,因此在解码之前,必须先将其转换为字节,然后Python使用默认编码(u'\xd6'
)来完成。正确的解决方案是 drop 'ascii'
- 不解码Unicode 字符串(在Python 3中修复,如果你在那里得到.decode('utf-8')
尝试解码Unicode字符串)。
第一个问题“UnicodeEncodeError:'charmap'”可能是由于将Unicode打印到Windows控制台。要重现,请运行AttributeError
。要修复它,install win-unicode-console
。
答案 1 :(得分:0)
MySQL驱动程序自动将UTF-8字符串解码为Python Unicode对象。
你应该能够证明这一点:
>>> type(tmpDict[0]['NAME'])
<type 'unicode'>
您应该可以直接将tmpDict[0]['NAME']
打印到控制台。如果打印仍有问题,请再次在StackOverflow中查找异常