Python - 'ascii' 编解码器无法解码字节
我正在使用Python 2.6和Jinja2来生成HTML报告。我给模板提供了很多结果,然后模板会循环这些结果,创建HTML表格。
但是,当我调用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还不太熟悉,希望能得到一些建议,帮助我调查这个问题,找到根本原因。
7 个回答
43
来自 http://jinja.pocoo.org/docs/api/#unicode
Jinja2 在内部使用 Unicode,这意味着你需要传递 Unicode 对象给渲染函数,或者只包含 ASCII 字符的字节字符串。
所以在你设置 result.result_str 的时候,需要确保它是 Unicode 格式,比如:
result.result_str = unicode(my_string_variable, "utf8")
(如果你的字节是 utf8 编码的 Unicode)
或者
result.result_str = u"my string"
78
试着加上这个:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这解决了我的问题,祝你好运。
20
如果你遇到一个像“ABC”这样的字符串错误,可能是因为某个地方有非ASCII字符。也许是在模板的源代码里?
无论如何,建议在你的应用程序中始终使用Unicode字符串,这样可以避免这类问题。如果你的数据源给你的是字节字符串,可以通过 byte_string.decode('utf-8')
来转换成Unicode字符串,前提是这个字符串是用UTF-8编码的。如果你的数据来源是一个文件,可以使用代码模块中的 StreamReader
类。
如果你不太清楚Unicode字符串和普通字符串的区别,可以看看这个链接:http://www.joelonsoftware.com/articles/Unicode.html