繁体   English   中英

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

[英]Python - 'ascii' codec can't decode byte

我正在使用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的新手,我很欣赏任何有关如何调查问题以找到根本原因的想法。

尝试添加:

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

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

来自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"

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

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

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

刚刚在一段代码中遇到了同样的问题,它将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(...))

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

my_string_variable.decode( “UTF8”)

ASCII是一个7位代码。 值0xC4不能以7位存储。 因此,您对该数据使用了错误的编码。

或者你可能会这样做

export LANG='en_US.UTF-8'

在运行脚本的控制台中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM