我正在开发一个使用python预处理请求的网站和一个用于存储信息的MySQL数据库。
我的所有表格都是utf8,我也使用utf8作为内容类型。
我有这段代码来建立与db的连接:
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字符都转换为两个不同的特殊字符)。但是如果我离开encode语句,它会为每个非ascii字母提供编码错误。
答案 0 :(得分:1)
听起来好像results
包含一个Unicode字符串,该字符串是从来自数据库的字节字符串中错误解码的。即当你从数据库中读取数据时,它将字节字符串解码为Latin-1而不是UTF-8。
因此,如果您修复了数据库内容的解码,那么您应该开始营业。
答案 1 :(得分:0)
我使用的是我在自己的编码搜索中在互联网上找到的类似内容。您可以继续链接编码样式以找到合适的效果。
另外,正如其他人所说,首先尝试修复源代码。这个hack只是想弄清楚实际返回的是什么编码。希望这会有所帮助。
#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