我正在使用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的新手,我很欣赏任何有关如何调查问题以找到根本原因的想法。
答案 0 :(得分:76)
尝试添加:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
它解决了我的问题,祝你好运。
答案 1 :(得分:41)
来自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"
答案 2 :(得分:20)
如果您收到类似“ABC”的字符串错误,则非ASCII字符可能位于其他位置。在模板源中可能吗?
在任何情况下,请在整个应用程序中使用Unicode字符串以避免此类问题。如果您的数据源为您提供字节字符串,那么如果字符串以UTF-8编码,则会获得带有byte_string.decode('utf-8')
的unicode字符串。如果您的源是文件,请使用编解码器模块中的StreamReader
类。
如果您不确定Unicode字符串和常规字符串之间的区别,请阅读:http://www.joelonsoftware.com/articles/Unicode.html
答案 3 :(得分:9)
在一段将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(...))
答案 4 :(得分:4)
简单字符串可能包含UTF-8字符字节,但它们不是unicode类型。这可以通过“解码”来解决,它将str转换为unicode。适用于Python 2.5.5。
my_string_variable.decode( “UTF8”)
答案 5 :(得分:0)
ASCII是一个7位代码。值0xC4不能以7位存储。因此,您对该数据使用了错误的编码。
答案 6 :(得分:-1)
或者你可能会这样做
export LANG='en_US.UTF-8'
在运行脚本的控制台中。