JAL*_*JAL 6 python mysql django unicode utf-8
我在Django中存储并输出一个ndash字符作为UTF-8时遇到了麻烦.
我从API获取数据.在原始格式中,在文本编辑器中检索和查看时,给定的数据单元可能类似于:
"I love this detergent \u2013 it is so inspiring."
Run Code Online (Sandbox Code Playgroud)
(\ u2013–作为html实体).
如果我直接从API获得并在Django中显示它,没问题.它在我的浏览器中显示为长划线.我注意到,decode('utf-8')如果我尝试在我的视图中对该文本进行一些操作,则必须避免"'ascii'编解码器无法编码字符"错误.根据Django调试工具栏的说法,文本将作为"我喜欢这种洗涤剂,它非常鼓舞人心."的模板.
然而,当存储到MySQL并通过相同的视图和模板读取输出时,它最终看起来像
"I love this detergent – it is so inspiring"
Run Code Online (Sandbox Code Playgroud)
我的MySQL表设置为DEFAULT CHARSET=utf8.
现在,当我通过设置为Utf-8的终端中的MysQl监视器从数据库中读取数据时,它显示为
"I love this detergent – it is so inspiring"
Run Code Online (Sandbox Code Playgroud)
(正确 - 显示ndash)
当我在python shell中使用mysqldb时,这一行是
"I love this detergent \xe2\x80\x93 it is so inspiring"
Run Code Online (Sandbox Code Playgroud)
(这是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'}]
Run Code Online (Sandbox Code Playgroud)
在我看来,Django \xe2\x80\x93意味着三个独立的字符,并将其编码为UTF-8 \xc3\xa2\xe2\x82\xac\xe2\x80\x9c.这显示为 - 因为\ xe2似乎是â,\ x80似乎是€等等.我已经检查过,这也是它被发送到模板的方式.
但是,如果你在Python中解码长序列decode('utf-8'),那么结果\xe2\u20ac\u201c也会在浏览器中呈现为 - ..尝试再次解码会产生UnicodeDecodeError.
据我所知,我已经遵循了Django对Unicode的建议(配置了MySQL).
关于我可能错误配置的任何建议?
增编似乎同样的问题在其他领域或系统也随之而来还有,作为同时寻找\ XC3\XA2\XE2\X82 \西飞\ XE2\X80\x9c,我发现在http://pastie.org/ 908443.txt一个脚本来"修复坏的UTF8实体.",也可以在wordpress RSS导入插件中找到.它只是用 - 替换这个序列.不过,我想以正确的方式解决这个问题!
哦,我正在使用Django 1.2和Python 2.6.5.
我可以使用PHP/PDO连接到同一个数据库并打印出这些数据而不做任何特殊操作,看起来很好.
这看起来确实像是双重编码的情况;我对 Python 没有太多经验,但尝试按照http://tahpot.blogspot.com/2005/06/mysql-and-python-and-unicode.html上的建议调整 MySQL 连接设置
我猜测发生的情况是连接是latin1,因此MySQL在存储到UTF-8字段之前尝试再次对字符串进行编码。那里的代码,特别是这一点:
编辑:使用Python建立数据库连接时添加以下标志:init_command='SET NAMES utf8'。
另外在MySQL的my.cnf中设置以下内容:default-character-set = utf8
可能就是你想要的。
| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |