Unicode

2018-02-24 15:39 更新

Jinja2 內(nèi)部使用 Unicode ,這意味著你需要向渲染函數(shù)傳遞 Unicode 對象或只包含 ASCII 字符的字符串。此外,換行符按照默認(rèn) UNIX 風(fēng)格規(guī)定行序列結(jié)束(?\n?)。

Python 2.x 支持兩種表示字符串對象的方法。一種是?str?類型,另一種是?unicode?類型,它們都繼承于?basestring?類型。不幸的是,默認(rèn)的?str?不 應(yīng)該用于存儲基于文本的信息,除非只用到 ASCII 字符。在 Python 2.6 中,可以 在模塊層指定?unicode?為默認(rèn)值,而在 Python 3 中會是默認(rèn)值。

要顯式使用一個(gè) Unicode 字符串,你需要給字符串字面量加上?u?前綴:?u'H?nsel?undGretel?sagen?Hallo'?。這樣 Python 會用當(dāng)前模塊的字符編碼來 解碼字符串,來把字符串存儲為 Unicode 。如果沒有指定編碼,默認(rèn)是?ASCII?, 這意味著你不能使用任何非 ASCII 的標(biāo)識符。

在使用 Unicode 字面量的 Python 模塊的首行或第二行添加下面的注釋,來妥善設(shè) 置模塊編碼:

# -*- coding: utf-8 -*-

我們推薦為 Python 模塊和模板使用 utf-8 編碼,因?yàn)樵?utf-8 中,可以表示 Unicode 中的每個(gè)字符,并且向后兼容 ASCII 。對于 Jinja2 ,模板的默認(rèn)編碼 假定為 utf-8 。

用 Jinja2 來處理非 Unicode 數(shù)據(jù)是不可能的。這是因?yàn)?Jinja2 已經(jīng)在語言層 使用了 Unicode 。例如 Jinja2 在表達(dá)式中把不間斷空格視為有效的空格,這需要 獲悉編碼或操作一個(gè) Unicode 字符串。

關(guān)于 Python 中 Unicode 的更多細(xì)節(jié),請閱讀完善的?Unicode documentation?。

另一件重要的事情是 Jinja2 如何處理模板中的字符串字面量。原生實(shí)現(xiàn)會對所有 字符串字面量使用 Unicode ,但在過去這是有問題的,因?yàn)橐恍祜@式地檢查它 們的類型是否為str?。例如?datetime.strftime?不接受 Unicode 參數(shù)。 為了不徹底破壞它, Jinja2 對只有 ASCII 的字符串返回?str,而對其它返回?unicode:

>>> m = Template(u"{% set a, b = 'foo', 'f??' %}").module
>>> m.a
'foo'
>>> m.b
u'f\xf6\xf6'
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號