如何解决这个双重编码?
问题描述:
我正在开发一个网站使用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字母编码错误。
答
听起来好像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
结果如何显示?在一个网页?你在使用SSH吗?据猜测,它的编码是正确的,但是它被显示在一个需要像latin-1这样的单字节编码的环境中。 –
结果显示在网页上。由于它显示特殊字符,我认为环境必须兼容unicode。问题是,它似乎是双重编码。所有非ASCII字符都显示为另外两个字母,例如:“ó”(带小写字母的小写字母)字母显示为“Ô和“ö”(带分隔符的小写字母)为“Ô,但“ő”( o与双急)只有一个字母“Å”。 – kdani
不幸的是,它比'特殊角色'更复杂。有很多不同的字符编码,Web浏览器使用HTTP标头和HTML元标签来决定使用哪一个。如果您使用的是Firefox,则可以使用视图,字符编码,UTF-8来覆盖它。如果这是问题,那么你可能需要修复你的HTML模板。 –