Python: UnicodeDecodeError: 'ascii'编解码器无法解码字节0xd0的位置0: 超出范围(128)
场景:我有一个包含服务器名称的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的类型是长整型。
变量realm
里包含了Unicode字符。
我不知道为什么这不管用。
1 个回答
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,这样就会出错。