如何解决这种双重编码?

时间:2011-08-23 22:46:42

标签: python mysql

我正在开发一个使用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字母提供编码错误。

2 个答案:

答案 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