Python:UnicodeDecodeError:' ascii'编解码器不能解码位置0中的字节0xd0:序数不在范围内(128)

时间:2014-07-13 01:22:19

标签: python utf-8

场景:我在JSON文件中有一个服务器名称列表,该脚本会被脚本读取并放入字典中。然后我尝试在将成为SQL查询的内容中使用这些服务器名称。但是,我对UTF-8编码的字符串有一段时间了。

错误追溯:

Traceback (most recent call last):
  File "run.py", line 18, in <module>
    print(str(len(download.downloadRealmFiles('eu'))) + " EU files downloaded.")
  File "/var/www/etherealpost.com/scripts/ahdata/download.py", line 73, in downloadRealmFiles
    sql = u"UPDATE realms_lastmodified SET last_modified = '%d', latest_hash = '%s' WHERE region = '%s' AND realm = '%s'" % (lastModified, lastHash.encode('utf-8'), region.encode('utf-8'), realm)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)

代码:

realm = data['files'][0]['realm']
lastHash = realmFile.split('/')[-2]
lastModified = data['files'][0]['lastModified']
dataURLs.append(realmFile)
sql = u"UPDATE realms_lastmodified SET last_modified = '%d', latest_hash = '%s' WHERE region = '%s' AND realm = '%s'" % (lastModified, lastHash.encode('utf-8'), region.encode('utf-8'), realm.encode('utf-8'))

lastModified属于long类型 变量realm是包含Unicode字符的变量。

我不明白为什么这不起作用。

1 个答案:

答案 0 :(得分:3)

不要将字符串插入SQL查询中!请改用SQL参数并将其留给数据库来处理引用和Unicode值:

sql = """\
    UPDATE realms_lastmodified
    SET last_modified=?, latest_hash=?
    WHERE region=? AND realm=?
"""
cursor.execute(sql, (lastModified, lastHash, region, realm))

我在这里使用?作为参数占位符,但它取决于所使用的确切数据库库;您可能需要使用%s作为占位符(无论列的类型如何!)。

您的错误具体是由将编码的字节串插入Unicode值引起的。也不要这样做;插值,然后编码。否则,Python会尝试使用默认编解码器解码UTF8字节以再次获取Unicode,这在此处失败。