我正在尝试使用utf-8字符在Jinja2中渲染模板。这是我的模板的样子:
<!DOCTYPE HTML>
<html manifest="" lang="en-US">
<head>
<meta charset="UTF-8">
<title>{{title}}</title>
...
标题变量设置方式如下:
index_variables = {'title':''}
index_variables['title'] = myvar.encode("utf8")
template = env.get_template('index.html')
index_file = open(preview_root + "/" + "index.html", "w")
index_file.write(
template.render(index_variables)
)
index_file.close()
现在,问题在于myvar是从消息队列中读取的消息,并且可能包含那些特殊的UTF-8字符(例如“Séptimo Cine”)。
渲染模板看起来像:
...
<title>S\u00e9ptimo Cine</title>
...
我希望它成为:
...
<title>Séptimo Cine</title>
...
我进行了几次测试,但是无法使其工作。
我尝试在没有使用.encode("utf8")的情况下设置标题变量,但它会抛出异常(ValueError:Expected a bytes object, not a unicode object),所以我的猜测是初始消息是unicode。
我使用chardet.detect获取消息的编码(它是"ascii"),然后执行以下操作:myvar.decode("ascii").encode("cp852"),但标题仍然未正确呈现。
我还确保我的模板是UTF-8文件,但没有任何区别。
有任何想法吗?
File ... print template.render(context=getContent(....)) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1064-1088: ordinal not in range(256)
。在尝试了30分钟来解决“getContent”调用中的问题后,我发现了你的答案,它强调了问题出在打印上! - Richard CordenTypeError: write() argument must be str, not bytes
错误。你正在向输出文件中写入二进制数据,因此写入模式应该是"wb"
而不是"w"
。 - BjornO