UnicodeEncodeError:'charmap'与'Ö','Ç'等

时间:2015-11-13 10:12:52

标签: python unicode python-2.x

我连接到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)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

两个错误和两个问题:

  1. UnicodeEncodeError:'charmap'与'Ö','Ç'等
  2. 'ascii'编解码器无法对位置0中的字符u'\ xd6'进行编码:序数不在范围内(128)
  3. 如果[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中查找异常