首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Jinja2模板中使用utf-8字符

在Jinja2模板中使用utf-8字符
EN

Stack Overflow用户
提问于 2014-03-04 20:10:17
回答 3查看 46.1K关注 0票数 33

在用Jinja2呈现模板时,我尝试使用utf-8字符。下面是我的模板的样子:

代码语言:javascript
复制
<!DOCTYPE HTML>
<html manifest="" lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>{{title}}</title>
...

title变量设置如下所示:

代码语言:javascript
复制
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是从消息队列中读取的消息,可以包含这些特殊的utf8字符(例如。"Séptimo Cine")。

呈现的模板如下所示:

代码语言:javascript
复制
...
    <title>S\u00e9ptimo Cine</title>
...

我希望它是:

代码语言:javascript
复制
...
    <title>Séptimo Cine</title>
...

我做了几次测试,但我做不到。

  • 我尝试在没有.encode("utf8"),的情况下设置标题变量,但是它会引发一个异常(ValueError:预期的字节对象,而不是unicode对象),所以我的猜测是初始消息是unicode。
  • 我使用chardet.detect获取消息的编码(它是"ascii"),然后执行以下操作: myvar.decode("ascii").encode("cp852"),但标题仍然没有正确呈现。
  • 我还确保我的模板是一个UTF-8文件,但这并没有什么区别。

对怎么做有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-04 20:47:48

TL;DR:

  • 通过Unicodetemplate.render()
  • 将呈现的unicode结果编码为字节串,然后将其写入文件。

这让我困惑了一段时间。因为你知道

代码语言:javascript
复制
index_file.write(
    template.render(index_variables)
)

在一条语句中,这基本上只是Python关注的一行,因此您得到的跟踪是误导的:我在重新创建测试用例时得到的异常不是发生在template.render(index_variables)中,而是在index_file.write()中。所以像这样把代码分开

代码语言:javascript
复制
output = template.render(index_variables)
index_file.write(output)

是诊断UnicodeEncodeError在哪里发生的第一步。

Jinja返回unicode,您可以让它呈现模板。因此,在将结果写入文件之前,需要将结果编码为字节串:

代码语言:javascript
复制
index_file.write(output.encode('utf-8'))

第二个错误是将utf-8编码的字节串传递给template.render() - Jinja想要unicode。因此,假设您的myvar包含UTF-8,您需要首先将其解码为unicode:

代码语言:javascript
复制
index_variables['title'] = myvar.decode('utf-8')

所以,把所有这些放在一起,这对我来说是可行的:

代码语言:javascript
复制
# -*- coding: utf-8 -*-

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myproject', 'templates'))


# Make sure we start with an utf-8 encoded bytestring
myvar = 'Séptimo Cine'

index_variables = {'title':''}

# Decode the UTF-8 string to get unicode
index_variables['title'] = myvar.decode('utf-8')

template = env.get_template('index.html')

with open("index_file.html", "wb") as index_file:
    output = template.render(index_variables)

    # jinja returns unicode - so `output` needs to be encoded to a bytestring
    # before writing it to a file
    index_file.write(output.encode('utf-8'))
票数 40
EN

Stack Overflow用户

发布于 2014-03-04 20:47:39

试着把你的渲染命令改为.

代码语言:javascript
复制
template.render(index_variables).encode( "utf-8" )

Jinja2 2的文档说:“这将将呈现的模板返回为unicode字符串。”

http://jinja.pocoo.org/docs/api/?highlight=render#jinja2.Template.render

希望这能有所帮助!

票数 5
EN

Stack Overflow用户

发布于 2016-11-05 20:16:16

将下面的行添加到脚本的开头,它将正常工作,不会有任何进一步的更改:

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding("utf-8")
票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22181944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档