Python - 'ascii' 编解码器无法解码字节

41 投票
7 回答
62727 浏览
提问于 2025-04-16 12:04

我正在使用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

撰写回答