如何解决这个双重编码问题?

2 投票
2 回答
1326 浏览
提问于 2025-04-17 00:14

我正在用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格式。

所以,如果你修正数据库内容的解码方式,那你就可以正常使用了。

撰写回答