Unicode bug烧瓶jinja2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unicode bug烧瓶jinja2相关的知识,希望对你有一定的参考价值。
我正在寻找创建一个带有python回到烧瓶上的网页,一切都很有效,我会非常推荐烧瓶。但是当谈到Unicode et编码时,它总是很难在python之间进行网页等。
所以我有一个表格,我发布在一个特定的烧瓶路线,我得到我的价值观,我需要做一些小包装,以使我的变量在良好的顺序和所有。
我得到了这个词:
task_formatted.append(str(item['entity']))
我将其转换为str然后将其附加到列表中,以便我可以轻松地将其传递给我的模板
我希望str在网页python页面上呈现为UTF-8:
# -*- coding: utf-8 -*-
html页面:
<meta charset="utf-8"/>
我然后使用jinja在我的页面中打印它们:
{% for item in task %}
<tr>
<td>{{item[0].decode('utf-8')}}</td>
<td>{{item[1].decode('utf-8')}}</td>
<td>{{item[2]}}</td>
<td>{{item[3]}}</td>
<td>{{item[4]}}</td>
<td><button id="taskmodal1"></td>
</tr>
{% endfor %}
但我的项目[0] .decode('utf-8')和我的项目[1] .decode('utf-8')
印刷:
{'type':'资产','id':1404,'name':'Test-Asset comm xc3 xa9'}
代替
{'type':'资产','id':1404,'name':'测试 - 资产公用'}
我已经尝试了几种方法,使用.encode('utf-8')在python端使用unicode(str)和render_template()。编码('utf-8')我的想法越来越多。
公平地说我认为他们是我用Unicode不理解的东西所以我想得到一些解释(不是文档链接,因为我很可能已经读过它们)或者一些解决方案让它工作,
对于我的程序来说,能够正确编写str非常重要我在js http调用之后使用它。
谢谢
PS:我正在使用python2
我得到了这个词:
task_formatted.append(str(item['entity']))
我将它转换为
str
,然后将其附加到列表中,以便我可以轻松地将其传递给我的模板
此代码不符合您的想法。
>>> entity = {'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}
>>> str(entity)
"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\xc3\xa9'}"
当您在字典(或列表)上调用str
时,您无法获得在每个字典的键和值上调用str
的结果:您获得每个键和值的repr。在这种情况下,这意味着'Test-Assetcomcé'已经以难以逆转的方式转换为'Test-Asset comm xc3 xa9'。
>>> str(entity).decode('utf-8') # <- this doesn't work.
u"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\xc3\xa9'}"
如果你想使用{{ item }}
在模板中渲染你的词典,你可以使用json模块来序列化它们而不是str
。请注意,您需要将json(str
类型)转换为unicode
实例,以避免在渲染模板时使用UnicodeDecodeError
。
>>> import json
>>> template = jinja2.Template(u"""<td>{{item}}</td>""")
>>> j = json.dumps(d, ensure_ascii=False)
>>> uj = unicode(j, 'utf-8')
>>> print template.render(item=uj)
<td>{"type": "Asset", "id": 1404, "name": "Test-Asset commé"}</td>
一些一般观察/要点:
- 不要使用
str
(或unicode
)来序列化字典或列表之类的容器;使用像json或pickle这样的工具。 - 确保传递给jinja2的任何字符串文字都是
unicode
的实例,而不是str
- 使用Python2时,如果您的代码有可能处理非ascii值,请始终使用
unicode
,切勿使用str
。
你做错了。
<td>{{item[0].decode('utf-8')}}</td>
你为什么要添加decode
?这是错的。我建议你不要放任何转换功能。 UTF-8可以正常工作(我认为这是默认设置)。无论如何,你没有解码。你正在将字符串编码为UTF-8(“编码”:你使用代码UTF-8,“解码”:从特定的编码值到语义值:实际上在python中你不应该关心字符串是如何在内部的编码[BTW内部编码,一种UTF-8,latin1,UTF-16或UTF-32,根据编码整个字符串的最有效方式])。
只需删除decode('utf-8')
。在python代码上,你不应该关心编码和解码,而是关注输入和输出:使用三明治规则。这将极大地简化字符串,逻辑的处理,并避免大多数错误
我找到了解决问题的方法:
unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))
首先我将我的dict转换为带有str()的字符串然后我将它转换为UTF-8 Unicode与unicode('str','utf-8')在导入unicodedata后最终结束我使用unicodedata.normalize()
希望它能帮到人们
以上是关于Unicode bug烧瓶jinja2的主要内容,如果未能解决你的问题,请参考以下文章
jinja2.exceptions.TemplateNotFound 错误 [重复]