以下代码正常运行:
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表示法表示。
答案 0 :(得分:3)
来自Jinja docs:
“Jinja2在内部使用Unicode,这意味着您必须将Unicode对象传递给渲染函数或仅包含ASCII字符的字节串。”
mylist = [u'some text \xc3']
答案 1 :(得分:2)
您永远不应该打开编码文件而不能解码它。
您应该从curl读取编码(例如,使用-i
或-H
选项)并解析HTTP标头或输出文件(如果标头中未指定编码)。
或者作为curl的替代方法,您可以使用不需要写入文件的requests
库。获取Web资源将如下所示:
>>> r = requests.get('http://python.org')
>>> r.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML...
其中content
已按照HTTP规范进行编码。
作为最后一种方法,您可以猜测编码并替换未知字符。这将是最容易实施的解决方案。例如:
with codecs.open(filename, encoding='utf-8', errors='replace') as fobj:
...
你的方法总是会丢失信息(如果有非ascii字符)。我的前两种方法永远不会和最后一种方法只有在猜测的编码是错误的时候。
答案 2 :(得分:0)
我明白了。关键是做str.encode('string-escape')
所以,我这样做了:
template = Template('{{ list[0].encode("string-escape") }}')
这很有效。
答案 3 :(得分:0)
jla适合我的情况。
我使用utf-8作为python源文件,所以使用u前缀来解决我的问题。