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

时间:2011-02-18 11:07:42

标签: python jinja2

我正在使用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 个答案:

答案 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'

在运行脚本的控制台中。

相关问题