我正在使用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)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,即使我将result.result_str设置为一个简单的ascii字符串,如每个结果的"abc",我仍然看到这个错误.我是Jinja2和Python的新手,我很欣赏任何有关如何调查问题以找到根本原因的想法.
小智 77
尝试添加:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Run Code Online (Sandbox Code Playgroud)
它解决了我的问题,祝你好运.
Mar*_*one 41
来自http://jinja.pocoo.org/docs/api/#unicode
Jinja2在内部使用Unicode,这意味着您必须将Unicode对象传递给渲染函数或仅包含ASCII字符的字节串.
因此,无论您在何处设置result.result_str,都需要将其设置为unicode,例如
result.result_str = unicode(my_string_variable, "utf8")
Run Code Online (Sandbox Code Playgroud)
(如果你的字节是utf8编码的unicode)
要么
result.result_str = u"my string"
Run Code Online (Sandbox Code Playgroud)
jd.*_*jd. 20
如果您收到类似"ABC"的字符串错误,则非ASCII字符可能位于其他位置.在模板源中也许?
在任何情况下,请在整个应用程序中使用Unicode字符串以避免此类问题.如果您的数据源为您提供了字节字符串,那么byte_string.decode('utf-8')
如果字符串以UTF-8编码,则会获得unicode字符串.如果您的源是文件,请使用StreamReader
编解码器模块中的类.
如果您不确定Unicode字符串和常规字符串之间的区别,请阅读:http://www.joelonsoftware.com/articles/Unicode.html
Dae*_*Dae 10
刚刚在一段代码中遇到了同样的问题,它将Jinja2的输出保存为HTML文件:
with open(path, 'wb') as fh:
fh.write(template.render(...))
Run Code Online (Sandbox Code Playgroud)
很容易归咎于Jinja2,虽然实际问题出现在Python open()
版本中,2.7版本不支持UTF-8.修复很简单:
import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
fh.write(template.render(...))
Run Code Online (Sandbox Code Playgroud)
简单字符串可能包含 UTF-8 字符字节,但它们不是 unicode 类型。这可以通过将 str 转换为 unicode 的“解码”来解决。适用于 Python 2.5.5。
my_string_variable.decode("utf8")