Unicode错误烧瓶Jinja2

时间:2019-03-19 14:03:20

标签: python flask unicode jinja2 repr

我正在寻找一个在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

3 个答案:

答案 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>

一些一般性观察/要点:

  • 请勿使用str(或unicode)来序列化字典或列表之类的容器;使用jsonpickle之类的工具。
  • 确保传递给jinja2的所有字符串文字都是unicode的实例,而不是str的实例
  • 使用Python2时,如果您的代码有可能会处理非ascii值,请始终使用unicode,切勿使用str

答案 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>

希望对人有帮助