如何解决这个双重编码问题?
我正在用Python开发一个网站,用来处理请求,并用MySQL数据库来存储信息。
我的所有数据表都是utf8编码的,我在内容类型上也使用utf8。
我有这段代码用来连接数据库:
database_connection = MySQLdb.connect(host = database_host, user = database_username, passwd = database_password, db = database_name, use_unicode = True)
cursor = database_connection.cursor()
cursor.execute("""SET NAMES utf8;""");
cursor.execute("""SET CHARACTER SET utf8;""");
cursor.execute("""SET character_set_connection=utf8;""");
在我的GoDaddy主机上运行一个简单的测试,打印一个简单的SELECT查询的结果,代码如下:
print results.encode("utf-8")
结果显示是一个双重编码的字符串。(所以所有非ASCII字符都被转换成了两种不同的特殊字符)。但如果我不加编码的那一行,就会对每个非ASCII字母报编码错误。
2 个回答
0
我在网上找到了类似的东西,用来解决我自己编码的问题。你可以不断尝试不同的编码方式,找到适合你的。
另外,正如其他人所说,先尝试修复源头的问题。这种方法只是为了弄清楚实际返回的是什么编码。希望这对你有帮助。
#this method is a simple recursive hack that is going to find a compatible encoding for the problematic field
#does not guarantee successful encoding match. If no match is found, an error code will be returned: ENC_ERR
def findencoding(field, level):
print "level: " + str(level)
try:
if(level == 0):
field = field.encode('cp1252')
elif(level == 1):
field = field.encode('cp1254')
else:
return "ENC_ERR"
except Exception:
field = findencoding(field,level+1)
return field
1
听起来像是 results
里面有一个Unicode字符串,但它是从数据库中的字节字符串错误解码过来的。也就是说,当你从数据库读取数据时,它把字节字符串当成了Latin-1格式来解码,而实际上它应该是UTF-8格式。
所以,如果你修正数据库内容的解码方式,那你就可以正常使用了。