我目前正在为我们的图书馆员开发一个报告应用程序(使用 Django 编写),以解决我们在某些实验室遇到的一些问题(我在一所大学工作)。为此,我创建了一个页面,列出了所有有问题的实验室。我正在测试添加注释,效果很好。UTF8 字符除外。而且我不知道(还不)该过程的哪一部分失败了。
问题:è char在 HTML 页面中打印为è 。
这是我个人的“追溯”:
- 我使用 Terminal.app(UTF-8 格式)通过 SSH 连接到我的测试服务器
- 服务器
LANG
是en_US.UTF-8
- 我添加了启动 ipython的注释 (
annotation.text = u'2ème commentaire'
)python manage.py shell_plus
- 我尝试添加
DEFAULT_CHARSET="utf-8"
我的设置,没有任何变化。 - 我检查了 MySQL 的配置:
character_set_database
是utf8
. ASELECT
显示正确的文本。 - 在我的views.py 中,我只是从数据库中获取注释并对其进行排序。然后我
direct_to_template
用包含数据的字典调用。 - 在我的模板中,HTML 页面字符集设置为
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
,我使用{{ annotation.text|escape }}
.
问题似乎出现在第 5-6 步,但我不知道如何抓住它,而且——显然——如何纠正它。你有什么主意吗 ?
谢谢
PS:如果您愿意,我可以为您提供更多代码,但这更有可能使您感到困惑(因为我认为 DB 结构有点奇怪)。
回答 (由于我的代表少于 10 个,我现在无法回答自己,所以我在下面发布答案。)
我终于找到了答案!
In [13]: annotation.text
Out[13]: u'2\xc3\xa8me commentaire'
In [14]: annotation.text = '2ème commentaire'
In [15]: annotation.save()
In [16]: annotation.text
Out[16]: '2\xc3\xa8me commentaire'
显然,表示字符串采用 UTF-8 格式的“u”是“矫枉过正”。有两种方法可以在 UTF-8 中编码相同的字符(如果我正确理解了我读到的内容):
In [37]: print('\xc3\xa8').decode('utf8')
è
In [38]: print(u'\xe8')
è
In [39]: print(u'\xc3\xa8')
è
我只是选择了两者的混合,而且……嗯,那是错误的。
无论如何感谢您的回答!