为了账号安全,请及时绑定邮箱和手机立即绑定

Unicode 错误烧瓶 jinja2

Unicode 错误烧瓶 jinja2

至尊宝的传说 2021-12-09 18:13:34
我希望在烧瓶上创建一个带有 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 %}但是我的 item[0].decode('utf-8') 和我的 item[1].decode('utf-8')正在打印:{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\xc3\xa9'}代替{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé}我已经在 python 端使用 .encode('utf-8') 尝试了几种方法,使用 unicode(str) 和 render_template().encode('utf-8') 而我的想法越来越少。公平地说,我认为它们是我对 Unicode 不理解的东西,所以我想得到一些解释(不是文档链接,因为我很可能已经阅读了它们)或一些解决方案来让它工作,对于我的程序能够正确编写 str 非常重要,我在 js http 调用后使用了它。谢谢PS:我使用的是python2
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

我得到了这个字典:


task_formatted.append(str(item['entity']))

我将其转换为 a str,然后将其附加到列表中,以便我可以轻松地将其传递给我的模板


这段代码并没有像你想象的那样做。


>>> entity = {'type': 'Asset', 'id': 1404, 'name': 'Test-Asset commé'}

>>> str(entity)

"{'type': 'Asset', 'id': 1404, 'name': 'Test-Asset comm\\xc3\\xa9'}"

当你调用str字典(或列表)时,你不会得到调用str字典的每个键和值的结果:你得到每个键和值的代表。在这种情况下,这意味着“Test-Asset commé”已以难以逆转的方式转换为“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。


查看完整回答
反对 回复 2021-12-09
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

你做错了。

<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代码上,你不应该关心编码和解码,而应该关心输入和输出:使用三明治规则。这将极大地简化字符串、逻辑的处理,并避免大多数错误


查看完整回答
反对 回复 2021-12-09
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我找到了解决我的问题的方法:

unicodedata.normalize('NFKD', unicode(str(item['entity']['type']) + str(item['entity']['name']),'utf-8'))

首先,我用 str() 将我的 dict 转换为一个字符串,然后在导入 unicodedata 后我用 unicode('str' , 'utf-8') end finaly 将它转换为 UTF-8 Unicode 我使用 unicodedata.normalize()

希望它会帮助人们


查看完整回答
反对 回复 2021-12-09
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信