Unicode bug烧瓶jinja2

问题描述 投票:0回答:3

我正在寻找创建一个带有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

python flask unicode jinja2 repr
3个回答
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-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)来序列化字典或列表之类的容器;使用像jsonpickle这样的工具。
  • 确保传递给jinja2的任何字符串文字都是unicode的实例,而不是str
  • 使用Python2时,如果您的代码有可能处理非ascii值,请始终使用unicode,切勿使用str

0
投票

你做错了。

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


-1
投票

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

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()

希望它能帮到人们

© www.soinside.com 2019 - 2024. All rights reserved.