Unicode

Jinja2 内部使用 Unicode ,这意味着你需要向渲染函数传递 Unicode 对象或只包含ASCII 字符的字符串。此外,换行符按照默认 UNIX 风格规定行序列结束( \n )。

Python 2.x 支持两种表示字符串对象的方法。一种是 str 类型,另一种是unicode 类型,它们都继承于 basestring 类型。不幸的是,默认的 str 不应该用于存储基于文本的信息,除非只用到 ASCII 字符。在 Python 2.6 中,可以在模块层指定 unicode 为默认值,而在 Python 3 中会是默认值。

要显式使用一个 Unicode 字符串,你需要给字符串字面量加上 u 前缀:u'HänselundGretelsagenHallo' 。这样 Python 会用当前模块的字符编码来解码字符串,来把字符串存储为 Unicode 。如果没有指定编码,默认是 ASCII ,这意味着你不能使用任何非 ASCII 的标识符。

在使用 Unicode 字面量的 Python 模块的首行或第二行添加下面的注释,来妥善设置模块编码:

  1. # -*- coding: utf-8 -*-

我们推荐为 Python 模块和模板使用 utf-8 编码,因为在 utf-8 中,可以表示Unicode 中的每个字符,并且向后兼容 ASCII 。对于 Jinja2 ,模板的默认编码假定为 utf-8 。

用 Jinja2 来处理非 Unicode 数据是不可能的。这是因为 Jinja2 已经在语言层使用了 Unicode 。例如 Jinja2 在表达式中把不间断空格视为有效的空格,这需要获悉编码或操作一个 Unicode 字符串。

关于 Python 中 Unicode 的更多细节,请阅读完善的Unicode documentation

另一件重要的事情是 Jinja2 如何处理模板中的字符串字面量。原生实现会对所有字符串字面量使用 Unicode ,但在过去这是有问题的,因为一些库显式地检查它们的类型是否为 str 。例如 datetime.strftime 不接受 Unicode 参数。为了不彻底破坏它, Jinja2 对只有 ASCII 的字符串返回 str,而对其它返回unicode:

  1. >>> m = Template(u"{% set a, b = 'foo', 'föö' %}").module
  2. >>> m.a
  3. 'foo'
  4. >>> m.b
  5. u'f\xf6\xf6'