3

以下代码正常工作:

from jinja2 import Template

mylist = ['some text \xc3']

template = Template('{{ list }}')

print template.render(list=mylist)

当我运行它时,它输出:

['some text \xc3']

然而,当我尝试打印实际的列表元素时,它失败了:

template = Template('{{ list[0] }}')

print template.render(list=mylist)

错误是:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)

我想找到一种以与打印整个列表相同的方式打印单个列表元素的方法,其中非 ascii 字符用 \x 表示法表示。

4

4 回答 4

3

来自Jinja 文档

“Jinja2 在内部使用 Unicode,这意味着您必须将 Unicode 对象传递给渲染函数或仅由 ASCII 字符组成的字节串。”

mylist = [u'some text \xc3']
于 2012-12-21T08:42:26.940 回答
2

你永远不应该打开一个编码文件而不是解码它。

您应该从 curl 中读取编码(例如,使用-i-H选项)并解析 HTTP 标头或如果标头中未指定编码,则解析输出文件。

或者作为 curl 的替代方案,您可以使用requests不需要写入文件的库。获取 Web 资源将如下所示:

>>> r = requests.get('http://python.org')
>>> r.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML...

Wherecontent已经按照 HTTP 规范进行了编码。

作为最后一种方法,您可以猜测编码并替换未知字符。这将是最容易实施的解决方案。例如:

with codecs.open(filename, encoding='utf-8', errors='replace') as fobj:
    ...

您的方法总是会丢失信息(如果有非 ascii 字符)。我的前两种方法永远不会,最后一种方法只有在猜测的编码错误的情况下。

于 2012-06-11T06:39:50.490 回答
0

我想到了。关键是要做str.encode('string-escape')

所以,我这样做了:

template = Template('{{ list[0].encode("string-escape") }}')

这奏效了。

于 2012-06-06T06:15:39.323 回答
0

jla 适合我的情况。

我对 python 源文件使用 utf-8,所以使用 u 前缀解决了我的问题。

于 2013-12-12T10:00:37.130 回答