2011-02-18 121 views
36

我正在使用Python 2.6和Jinja2來創建HTML報告。我爲模板提供了許多結果,模板循環遍歷它們並創建HTML表格Python - 'ascii'編解碼器無法解碼字節

當調用template.render時,我突然開始出現此錯誤。

<td>{{result.result_str}}</td> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

奇怪的是,即使我設置result.result_str一個簡單的ASCII字符串,如「ABC」爲每一個結果,我仍然看到這個錯誤。我對Jinja2和Python不熟悉,並希望能就如何開展調查問題以找到根本原因提供任何建議。

回答

19

如果您遇到類似「ABC」的字符串錯誤,可能是非ASCII字符在其他地方。也許在模板源?

無論如何,在整個應用程序中使用Unicode字符串以避免這類問題。如果您的數據源爲您提供字節字符串,則您將獲得帶有byte_string.decode('utf-8')的Unicode字符串(如果該字符串使用UTF-8編碼)。如果您的源是一個文件,請在編解碼器模塊中使用StreamReader類。

如果你不確定Unicode字符串和普通字符串之間的區別,請閱讀本:http://www.joelonsoftware.com/articles/Unicode.html

+0

我檢查了非ascii模板,在Vim中我運行了「set isprint =」,但它沒有顯示任何非ascii。 – shane 2011-02-18 11:39:59

+0

並且沒有其他變量,模板會嘗試在您的帖子中顯示的行之後進行渲染,這可能包含並編碼了字符串?如果不是,你可以減少你的模板到最低限度,以重現錯誤? – 2011-02-18 11:44:19

0

ASCII是一個7位代碼。值0xC4不能存儲在7位中。因此,您正在使用該數據的錯誤編碼。

+1

我明白錯誤的含義。我正在尋找一些關於追蹤我爲何獲得它的指針。 – shane 2011-02-18 11:20:28

+0

@shane:因爲你正在使用`0xC4`。找到這個角色。去掉它。 – 2011-02-18 15:21:14

+2

@shane:可能值得注意的是,0xc4是[U + 0100和U + 013F之間的UTF8編碼字符的第一個字節](http://www.utf8-chartable.de/unicode-utf8-table.pl?開始= 256&unicodeinhtml =十六進制)。 – 2011-02-18 16:16:54

39

http://jinja.pocoo.org/docs/api/#unicode

Jinja2的是使用Unicode內部,這意味着你必須通過Unicode對象,以渲染函數或只包含ASCII字符的字節串。

因此,無論您設置result.result_str,您都需要將其設置爲unicode。

result.result_str = unicode(my_string_variable, "utf8") 

(如果你的字節是utf-8編碼的Unicode)

result.result_str = u"my string" 
3

簡單的字符串可能包含UTF-8字符字節,但他們是類型的Unicode不。這可以通過將str轉換爲unicode的「解碼」來解決。適用於Python 2.5.5。

my_string_variable.decode( 「UTF-8」)

69

嘗試添加此:

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

它固定我的問題,好運氣。

-1

或者你可以做

export LANG='en_US.UTF-8' 

在你的控制檯,您運行該腳本。

7

就遇到了一段代碼同樣的問題,從而節省從Jinja2的輸出HTML文件:

with open(path, 'wb') as fh: 
    fh.write(template.render(...)) 

這很容易責怪的Jinja2,雖然實際的問題是Python的open()其作爲2.7版本沒有按不支持UTF-8。修復如此簡單:

import codecs 
with codecs.open(path, 'wb', 'utf-8') as fh: 
    fh.write(template.render(...)) 
相關問題