【问题标题】:Hack Jinja2 to encode from `utf-8` instead of `ascii`?破解 Jinja2 从 `utf-8` 而不是 `ascii` 编码?
【发布时间】:2015-02-21 06:14:00
【问题描述】:

Jinja2 在处理之前将所有模板变量转换为 unicode。有人能找到发生这种情况的地方吗?

问题是它假设字符串是ascii,但我们(在Roundup)在内部使用utf-8,我们的ORM(HyperDB)自动将对象属性恢复为utf-8,并将它们全部转换为@987654324 @ 在传递给模板之前的每个视图中都是太多的工作。

【问题讨论】:

  • 避免隐式 Python 2 默认字节->unicode 强制,显式传递 unicode。不要setdefaultencoding('utf-8')——它隐藏了错误。
  • @J.F.Sebastian,Python 2 没有字节。它假定这些是ascii 字符串。从ascii 切换到utf-8,您能否明确指出隐藏了什么错误?
  • 什么跑腿?为什么不直接在 ORM 中添加一个包装器来解码你的字符串呢?为什么这是 Jinja2 的问题?
  • @techtonik:这不是 Jinja2 的问题。 Jinja2 假设您使用文本,因此希望您只使用 unicode。使用默认编解码器(即 ASCII)将任何字节字符串转换为 unicode。一直喂它unicode 对象,没有问题。
  • Armin 给了你证明。 Jinja 在某些地方使用unicode.format()u'...' % (),不会调用unicode.__add__。由于它们使用字符串文字,因此您也无法提供子类。

标签: python unicode encoding utf-8 jinja2


【解决方案1】:

阿明的回答:

不幸的是,这是不可能的。 Jinja 在 2.x 上使用 Python 为提高速度而提供的默认字符串强制转换。没有保证可以调用 unicode。您唯一的糟糕选择是重新加载 sys 并调用 sys.setdefaultencoding('utf-8') 或其他东西。

更新:Jinja2 2.8 包含一些与隐式字符串转换相关的更新。这让我想到,可以通过覆盖 unicode 类型的 __add__ 方法来不使用 sys.setdefaultencoding('utf-8'),并确保在连接字符串时首先使用它的类型。

https://github.com/mitsuhiko/jinja2/issues/511

【讨论】:

  • 太棒了!我经历了所有关于 setdefaultendcoding() 危险的讨论,你坚定的立场得到了很好的回报,并且非常清晰。宗教狂热分子无法为只存在于他们梦中的“真实”危险提供轶事。刚刚开始并将其放置在项目级别 init.py 本身:-D
  • @itsneo 是的,这件事似乎过于复杂,所以没有人能看到全貌。但是如果你想出一个真实的灾难故事,别忘了加我到CC。 =)
猜你喜欢
  • 1970-01-01
  • 2014-02-09
  • 2014-08-26
  • 2017-10-02
  • 2013-05-01
  • 1970-01-01
  • 2011-12-13
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多