Jinja2 內部使用 Unicode ,這意味著你需要向渲染函數傳遞 Unicode 對象或只包含 ASCII 字符的字符串。此外,換行符按照默認 UNIX 風格規定行序列結束(?\n?)。
Python 2.x 支持兩種表示字符串對象的方法。一種是?str?類型,另一種是?unicode?類型,它們都繼承于?basestring?類型。不幸的是,默認的?str?不 應該用于存儲基于文本的信息,除非只用到 ASCII 字符。在 Python 2.6 中,可以 在模塊層指定?unicode?為默認值,而在 Python 3 中會是默認值。
要顯式使用一個 Unicode 字符串,你需要給字符串字面量加上?u?前綴:?u'H?nsel?undGretel?sagen?Hallo'?。這樣 Python 會用當前模塊的字符編碼來 解碼字符串,來把字符串存儲為 Unicode 。如果沒有指定編碼,默認是?ASCII?, 這意味著你不能使用任何非 ASCII 的標識符。
在使用 Unicode 字面量的 Python 模塊的首行或第二行添加下面的注釋,來妥善設 置模塊編碼:
~~~
# -*- coding: utf-8 -*-
~~~
我們推薦為 Python 模塊和模板使用 utf-8 編碼,因為在 utf-8 中,可以表示 Unicode 中的每個字符,并且向后兼容 ASCII 。對于 Jinja2 ,模板的默認編碼 假定為 utf-8 。
用 Jinja2 來處理非 Unicode 數據是不可能的。這是因為 Jinja2 已經在語言層 使用了 Unicode 。例如 Jinja2 在表達式中把不間斷空格視為有效的空格,這需要 獲悉編碼或操作一個 Unicode 字符串。
關于 Python 中 Unicode 的更多細節,請閱讀完善的?[Unicode documentation](http://docs.python.org/dev/howto/unicode.html)?。
另一件重要的事情是 Jinja2 如何處理模板中的字符串字面量。原生實現會對所有 字符串字面量使用 Unicode ,但在過去這是有問題的,因為一些庫顯式地檢查它 們的類型是否為str?。例如?datetime.strftime?不接受 Unicode 參數。 為了不徹底破壞它, Jinja2 對只有 ASCII 的字符串返回?str,而對其它返回?unicode:
~~~
>>> m = Template(u"{% set a, b = 'foo', 'f??' %}").module
>>> m.a
'foo'
>>> m.b
u'f\xf6\xf6'
~~~
- 介紹
- 預備知識
- 安裝
- 基本 API 使用
- 實驗性的 Python 3 支持
- API
- 基礎
- Unicode
- 高層 API
- 自動轉義
- 標識符的說明
- 未定義類型
- 上下文
- 加載器
- 字節碼緩存
- 實用工具
- 異常
- 自定義過濾器
- 求值上下文
- 自定義測試
- 全局命名空間
- 低層 API
- 元 API
- 沙箱
- API
- 運算符攔截
- 模板設計者文檔
- 概要
- 變量
- 過濾器
- 測試
- 注釋
- 空白控制
- 轉義
- 行語句
- 模板繼承
- HTML 轉義
- 控制結構清單
- 導入上下文行為
- 表達式
- 內置過濾器清單
- 內置測試清單
- 全局函數清單
- 擴展
- 自動轉義擴展
- 擴展
- 添加擴展
- i18n 擴展
- 表達式語句
- 循環控制
- With 語句
- 自動轉義擴展
- 編寫擴展
- 集成
- Babel 集成
- Pylons
- TextMate
- Vim
- 從其它的模板引擎切換
- Jinja1
- Django
- Mako
- 提示和技巧
- Null-Master 退回
- 交替的行
- 高亮活動菜單項
- 訪問父級循環