Django双编码是Unicode(utf8)吗串?

2024-10-01 17:39:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django中将ndash字符存储和输出为UTF-8时遇到问题。在

我从API获取数据。在原始格式中,在文本编辑器中检索和查看时,给定的数据单位可能类似于:

"I love this detergent \u2013 it is so inspiring." 

(\u2013是一个html实体)。在

如果我直接从一个API得到这个,并用Django显示,没问题。它在我的浏览器中显示为长破折号。不过,我注意到,如果我试图对视图中的文本执行某些操作,我必须执行decode('utf-8')以避免“'ascii'codec can't encode character”错误。根据Django调试工具栏,文本将以“我爱这个洗涤剂\u2013它太鼓舞人心了”作为模板。在

但是,当存储到MySQL并通过相同的视图和模板读取输出时,它最终看起来像

^{pr2}$

MySQL表设置为DEFAULT CHARSET=utf8。在

现在,当我在一个设置为Utf-8的终端中通过MysQl监视器从数据库读取数据时,它显示为

"I love this detergent – it is so inspiring" 

(正确-显示ndash)

当我在pythonshell中使用mysqldb时,这一行是

"I love this detergent \xe2\x80\x93 it is so inspiring" 

(这是ndash的正确UTF-8)

但是,如果我运行python manage.py shell,然后

In [1]: import myproject.myapp.models ThatTable
In [2]: msg=ThatTable.objects.all().filter(thefield__contains='detergent')
In [3]: msg
Out[4]: [{'thefield': 'I love this detergent \xc3\xa2\xe2\x82\xac\xe2\x80\x9c it is so inspiring'}]

在我看来,Django已经将\xe2\x80\x93表示为三个独立的字符,并将其编码为UTF-8到\xc3\xa2\xe2\x82\xac\xe2\x80\x9c。这显示为–eure,因为\xe2似乎是–x80似乎是€,等等。我已经检查过了,这也是将其发送到模板的方式。在

但是,如果在Python中解码长序列,使用decode('utf-8'),结果是\xe2\u20ac\u201c,它在浏览器中也呈现为€”。再次尝试解码会产生一个UnicodeDecodeError。在

据我所知,我遵循了Django suggestions for Unicode(配置的MySQL)。在

有什么关于我可能错误配置的建议吗?在

在搜索\xc3\xa2\xe2\x82\xac\xe2\x80\x9c时,我在http://pastie.org/908443.txt找到了一个“修复错误UTF8实体”的脚本,该脚本也在wordpress RSS导入插件中找到。它只是将这个序列替换为–。不过,我想以正确的方式解决这个问题!在

我使用的是django1.2和python2.6.5。在

我可以用PHP/PDO连接到同一个数据库并打印出这些数据,而不需要做任何特殊的操作,看起来很好。在


Tags: django模板sois错误itthisutf
2条回答

我在php数据插入序列中添加了set names utf8,现在在pythonshell中,担心的ndash显示为\x96。当通过Django读取和输出时,这将正确呈现。在

一个不寻常的情况是我通过PHP插入数据。Django会自动发出set names utf8,因此如果我通过Django插入和读取数据,这个问题就不会出现。我想PHP使用的是默认的latin1

值得注意的是,在我可以从PHP读取数据并在浏览器中正常显示之前,ndash是¨除非在读取数据之前调用set names。在

所以,它现在起作用了,我希望我永远不必去了解以前发生了什么!在

这看起来确实是一个双重编码的情况;我对Python没有太多的经验,但是尝试按照http://tahpot.blogspot.com/2005/06/mysql-and-python-and-unicode.html上的建议调整MySQL连接设置

我猜是因为连接是latin1,所以MySQL会在存储到UTF-8字段之前再次对字符串进行编码。这里的代码,特别是这一位:

EDIT: With Python when establishing a database connection add the following flag: init_command='SET NAMES utf8'.

In addition set the following in MySQL's my.cnf: default-character-set = utf8

可能是你想要的。在

相关问题 更多 >

    热门问题