如何解决这个双重编码?

问题描述:

我正在开发一个网站使用python预处理请求和MySQL数据库来存储信息。如何解决这个双重编码?

我所有的表都是utf8,我也使用utf8作为Content-type。

我有这样的代码来建立连接到数据库:

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字母编码错误。

+0

结果如何显示?在一个网页?你在使用SSH吗?据猜测,它的编码是正确的,但是它被显示在一个需要像latin-1这样的单字节编码的环境中。 –

+0

结果显示在网页上。由于它显示特殊字符,我认为环境必须兼容unicode。问题是,它似乎是双重编码。所有非ASCII字符都显示为另外两个字母,例如:“ó”(带小写字母的小写字母)字母显示为“Ô和“ö”(带分隔符的小写字母)为“Ô,但“ő”( o与双急)只有一个字母“Å”。 – kdani

+0

不幸的是,它比'特殊角色'更复杂。有很多不同的字符编码,Web浏览器使用HTTP标头和HTML元标签来决定使用哪一个。如果您使用的是Firefox,则可以使用视图,字符编码,UTF-8来覆盖它。如果这是问题,那么你可能需要修复你的HTML模板。 –

听起来好像results包含一个Unicode字符串,该字符串从来自数据库的字节字符串中被错误地解码。即当你从数据库读取数据时,它将字节字符串解码为Latin-1,而不是它真正的UTF-8。

所以,如果你修复数据库内容的解码,那么你应该在业务。

+0

你是对的!我只需要解码UTF-8行。我认为这是GoDaddy独占的问题,因为他们有一个过时的MySQLdb版本。更高版本具有更好的编码功能。感谢所有答案家伙! – kdani

我使用类似这样的东西,这是我在自己的编码搜索过程中在互联网上找到的。您可以继续链接编码样式以找到合适的。

另外,正如其他人所说,先尝试修复源代码。这个黑客只是想知道实际返回的编码是什么。希望这可以帮助。

#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 
+0

如果我使用field = row [0]或结果的任何其他单个字段调用函数,则0级似乎是正确的,但是在整个页面上它将返回ENC_ERROR。 – kdani

+0

整个页面?嗯..你是否试图编码整个页面作为一个字符串使用这种方法,然后渲染它?我的理解是,只要您将结果转换为正确的编码,您就可以显示它们。在这种情况下,似乎涉及多个编码。您可以添加更多链接并添加级别,并查看可以获得解决的所有内容的位置。如果可能,你可以发布你正在尝试渲染的页面内容吗? – Urjit

+0

我使用Template类来生成页面内容。所有字符串都是Unicode类的对象。我只在最后一步调用编码方法。 – kdani