Django编码转换为UTF8无效。

5

我在这里有些困惑。我有这段代码,可以将文本中的html元素反转义并编码成utf8。

import HTMLParser

def clean_text(text):
    htmlparser = HTMLParser.HTMLParser()
    return htmlparser.unescape(
        ' '.join(text.replace('\n', '').split())
    ).replace(';', ',').encode('utf-8').strip()

我正在使用mysql(天啊,救救我吧!)

这段代码在两个项目中运行。在第一个项目中,代码正常工作,没有问题。在另一个项目中,字符串会被保存成这样:

Die Verbindungen zwischen Dinosauriern und Vögeln immer stärker

应该是这样的

Die Verbindungen zwischen Dinosauriern und Vögeln immer stärker

我在两个项目中都使用了django 1.7和python 2.7.9。

我错过了什么吗?mysql的排序规则是utf8_general_ci,字符集是utf8。在设置中,两个mysql数据库都是相同的。

如果有人能帮我调试这个问题,那就太棒了...如果能解决,我会给他一个温暖的拥抱和亲吻。


СйаТюЪТюЏclean_textуџёУЙЊтЄ║Тў»unicodeУ┐ўТў»bytes/str№╝Ъ - bgusach
@bgusach 很好的问题!我认为是 str :) - doniyor
2
我认为你应该了解你的函数期望输入和输出是什么。如果你要存储在数据库中,我会建议你不需要关心编码,只需传递Unicode对象(即不需要使用 encode)。 - bgusach
@bgusach 尝试了,但结果相同。 - doniyor
你在哪里以及如何得到了意外的结果? - bgusach
字符串仍未保存为UTF8 @bgusach - doniyor
2个回答

0

Vögeln --> Vögeln 是乱码的一个例子

  • 客户端中的字节已经正确编码为 utf8(好的)。
  • 您使用了 SET NAMES latin1(或 set_charset('latin1') 或其他类似的方式)连接数据库,这可能是默认设置。(应该使用 utf8)。
  • 表中的列可能已经设置为 CHARACTER SET utf8,但也可能没有设置,不过应该设置为 utf8。

以下链接可能有用:Django character latin1 mysql Incorrect string value in python+django+Mysql

Python 的检查清单:

  • # -*- coding: utf-8 -*- -- (用于代码中的文字)
  • connect() 调用中的 charset='utf8' -- 是否在 bottle_mysql.Plugin 中?(注意:尝试使用 'utf-8' 和 'utf8')
  • 文本编码为 utf8。
  • 如果您愿意在任何地方都接受 utf8,则不需要使用 encode() 或 decode()。
  • u'...' 用于文字
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在 html 页面开头附近
  • Content-Type: text/html; charset=UTF-8 (在 HTTP 响应头中)
  • header('Content-Type: text/html; charset=UTF-8'); (在 PHP 中获取该响应头)
  • MySQL 中列(或表)定义上的 CHARACTER SET utf8 COLLATE utf8_general_ci
  • [[UTF-8 all the way through all the way through]]
  • 使用 MySQL Connector/Python 替代 pyodbc 和 MySQL Connector/ODBC

(@DanielRoseman - 我有说错什么吗?)


-1
在您的文件顶部提到编码# coding: utf-8,它会像魔法一样运行。

它真的是写成 # coding: utf-8 吗?因为我只知道 # -*- coding: utf-8 -*-,而且我已经在里面了。 - doniyor
我使用了你的代码并指定了编码,它可以正常工作。 :) - Tarun Behal
2
我认为这是对一个模棱两可的问题的模棱两可的回答。 - bgusach
4
请不要随意推荐这个。编码声明只影响代码本身内的文字;而此问题是关于从数据库中检索文本,编码声明在这里根本没有任何作用。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接