40

我正在使用 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 的新手,如果我有任何关于如何着手调查问题以找到根本原因的想法,我将不胜感激。

4

7 回答 7

78

尝试添加这个:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

它解决了我的问题,祝你好运。

于 2013-02-17T08:41:54.087 回答
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"
于 2011-02-18T11:29:06.237 回答
20

如果您收到“ABC”之类的字符串错误,则非 ASCII 字符可能在其他位置。也许在模板源中?

无论如何,在整个应用程序中使用 Unicode 字符串来避免此类问题。如果您的数据源为您提供字节字符串byte_string.decode('utf-8'),则如果字符串以 UTF-8 编码,您将获得带有 的 unicode 字符串。如果您的源是文件,请使用StreamReader编解码器模块中的类。

如果您不确定 Unicode 字符串和常规字符串之间的区别,请阅读:http ://www.joelonsoftware.com/articles/Unicode.html

于 2011-02-18T11:27:47.137 回答
11

刚刚在一段将 Jinja2 的输出保存到 HTML 文件的代码中遇到了同样的问题:

with open(path, 'wb') as fh:
    fh.write(template.render(...))

很容易将责任归咎于 Jinja2,尽管实际问题出在 Pythonopen()中,从 2.7 版开始不支持 UTF-8。修复很简单:

import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
    fh.write(template.render(...))
于 2014-09-25T15:42:52.477 回答
5

简单字符串可能包含 UTF-8 字符字节,但它们不是 unicode 类型。这可以通过将 str 转换为 unicode 的“decode”来解决。在 Python 2.5.5 中工作。

my_string_variable.decode("utf8")

于 2011-04-17T13:24:47.727 回答
0

ASCII is a 7-bit code. The value 0xC4 cannot be stored in 7 bits. Therefore, you are using the wrong encoding for that data.

于 2011-02-18T11:18:34.993 回答
-1

或者你可以做

export LANG='en_US.UTF-8'

在您运行脚本的控制台中。

于 2013-02-20T12:19:19.153 回答