我正在寻找一个在flask上重新创建带有python的网页,一切工作正常,我将强烈推荐flask。但是,当涉及到Unicode et编码时,在python等网页之间总是很难。
所以我有一个表格,可以在特定的烧瓶路线上发布,我得到了我的值,我需要做一些小的包装以使变量按顺序排好序。
我得到了这个字典:
task_formatted.append(str(item['entity']))
我将其转换为str,然后将其附加到列表中,这样我就可以轻松地将其传递给模板
我希望str在网页上呈现为UTF-8 python页面:
# -*- 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,'名称':'测试资产comm \ xc3 \ xa9'}
代替
{'type':'Asset','id':1404,'name':'Test-Assetcommé'}
我在python端尝试了.encode('utf-8')和unicode(str)以及render_template()。encode('utf-8')的几种尝试,并且我逐渐摆脱了想法。>
为了公平起见,我认为它们是Unicode无法理解的,因此我想获得一些解释(不是文档链接,因为我很可能已经读过它们)或一些解决方案,以使其正常工作,
对于我的程序来说,能够正确地编写在js http调用中使用过的str至关重要。
谢谢
PS:我正在使用python2
答案 0 :(得分:1)
我得到了这个字典:
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-Assetcommé”已以难以逆转的方式转换为“ 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>
一些一般性观察/要点:
答案 1 :(得分:0)
您做错了事。
lowPrice
为什么要添加<td>{{item[0].decode('utf-8')}}</td>
?错了我建议您不要放置任何转换功能。 UTF-8可以正常工作(我认为它是默认设置)。无论如何,您都不会解码。您正在将字符串编码为UTF-8(“编码”:使用 code UTF-8 ,“解码”:从特定的编码值转换为语义值:实际上,在python中,您不应关心字符串是如何内部编码的[BTW是一种内部编码,根据对整个字符串进行编码的最有效方法,它是一种UTF-8,latin1,UTF-16或UTF-32]。
只需删除decode
。在python代码上,您不必关心编码和解码,而在输入和输出上:请使用三明治规则。这将大大简化字符串,逻辑的处理,并避免大多数错误
答案 2 :(得分:-1)
我找到了解决问题的方法:
unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))
首先我将dict转换为带有str()的字符串,然后在导入unicodedata后以unicode('str','utf-8')结尾将其转换为UTF-8 Unicode,我使用unicodedata.normalize()< / p>
希望对人有帮助