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

sha*_*ane 38 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)
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)

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

  • 这实际上是**可怕的建议**.OP应该确保首先将字节串解码为Unicode值.设置默认编码类似于通过将棍子捆扎在腿上而不是让自己到医院设置骨骼来保持行走在断腿上. (28认同)
  • 如果我真的希望一切都是UTF-8,为什么这是错的呢? (3认同)

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)

  • 谢谢,非常有用。 (2认同)

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)


cat*_*cat 5

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

my_string_variable.decode("utf8")