Python 让Jinja2从'utf-8'而不是'ascii'编码?

Python 让Jinja2从'utf-8'而不是'ascii'编码?,python,unicode,encoding,utf-8,jinja2,Python,Unicode,Encoding,Utf 8,Jinja2,Jinja2在处理之前将所有模板变量转换为unicode。有人能找到一个发生这种事的地方吗 问题是它假设字符串是ascii,但我们(在综述中)在内部使用utf-8,并且我们的ORM(HyperDB)自动将对象属性恢复为utf-8,在传递到模板之前,在每个视图中将它们全部转换为unicode,这太费事了。Armin回答: 不幸的是,这是不可能的。Jinja在2.x上使用Python为提高速度而提供的默认字符串强制。不保证调用unicode来生成某些内容。唯一糟糕的选择就是重新加载sys并调用sys

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

问题是它假设字符串是
ascii
,但我们(在综述中)在内部使用
utf-8
,并且我们的ORM(HyperDB)自动将对象属性恢复为
utf-8
,在传递到模板之前,在每个视图中将它们全部转换为
unicode
,这太费事了。

Armin回答:

不幸的是,这是不可能的。Jinja在2.x上使用Python为提高速度而提供的默认字符串强制。不保证调用unicode来生成某些内容。唯一糟糕的选择就是重新加载sys并调用sys.setdefaultencoding('utf-8')或其他什么

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


避免隐式Python 2默认字节->unicode强制,显式传递unicode。不要
setdefaultencoding('utf-8')
——它隐藏bug。@J.F.Sebastian,Python 2没有字节。它假定这些是
ascii
字符串。通过从
ascii
切换到
utf-8
,您可以明确哪些bug被隐藏了吗?什么样的工作?为什么不在ORM中添加一个包装器来解码字符串呢?为什么这是Jinja2的问题?@techtonik:这不是Jinja2的问题。Jinja2假设您使用文本,因此希望您只使用unicode。任何字节字符串都将使用默认编解码器(so ASCII)转换为unicode。一致地输入unicode对象,没有问题。Armin给了你证据。Jinja在不调用
unicode的地方使用
unicode.format()
u'…'%()
。因为它们使用字符串文本,所以您也不能提供子类。太好了!我讨论了所有关于setDefaultEndCodeing()的危险,你的坚定立场得到了很好的回报,并引起了极大的澄清。宗教狂热者无法为“真正”的危险带来轶事,这种危险只存在于他们的梦中。刚刚开始并将其放置在项目级别init.py中:-D@itsneo是的,事情似乎太复杂了,所以没有人能看到整个情况。但如果你想出了一个真正的灾难故事,别忘了将我添加到CC中。=)