Python CherryPy不';t正确处理Jinja2模板中的非ASCII字符

Python CherryPy不';t正确处理Jinja2模板中的非ASCII字符,python,unicode,character-encoding,cherrypy,jinja2,Python,Unicode,Character Encoding,Cherrypy,Jinja2,我正在尝试使用Python 2.7.1、Jinja 2.5.2和CherryPy 3.1.2运行一个网站。我使用的Jinja模板是UTF-8编码的。我注意到这些模板中的一些字符正在变成问号和其他胡言乱语。如果我尝试在没有Jinja的情况下直接渲染模板,我不会注意到这个问题。我发现我可以通过对我所有处理程序的输出调用.encode(“utf-8”)来修复它,但这会让人恼火,因为它会把我的源代码弄得乱七八糟。有人知道为什么会发生这种情况,或者该怎么办吗?我制作了一个小脚本来演示这个问题。“char.

我正在尝试使用Python 2.7.1、Jinja 2.5.2和CherryPy 3.1.2运行一个网站。我使用的Jinja模板是UTF-8编码的。我注意到这些模板中的一些字符正在变成问号和其他胡言乱语。如果我尝试在没有Jinja的情况下直接渲染模板,我不会注意到这个问题。我发现我可以通过对我所有处理程序的输出调用
.encode(“utf-8”)
来修复它,但这会让人恼火,因为它会把我的源代码弄得乱七八糟。有人知道为什么会发生这种情况,或者该怎么办吗?我制作了一个小脚本来演示这个问题。“char.txt”文件是一个2字节的文件,仅由UTF-8编码的“»”字符组成

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, jinja2, cherrypy
jinja2env = jinja2.Environment(loader=jinja2.FileSystemLoader("."))

class Test(object):
    def test1(self):
        #doesn't work
        #curl "http://example.com/test1"
        #?
        return jinja2env.get_template("char.txt").render()
    test1.exposed = True

    def test2(self):
        #works
        #curl "http://example.com/test2"
        #»
        return open("char.txt").read()
    test2.exposed = True

    def test3(self):
        #works, but it is annoying to have to call this extra function all the time
        #curl "http://example.com/test3"
        #»
        return jinja2env.get_template("char.txt").render().encode("utf-8")
    test3.exposed = True

cherrypy.config["server.socket_port"] = 8500
cherrypy.quickstart(Test())

jinja2仅适用于Unicode。当客户端发送no
Accept头时,cherrypy似乎通常使用utf-8作为输出编码,但当它为空时,会返回到iso-8859-1

tools.encode.encoding:如果指定, 如果响应失败,工具将出错 无法使用它进行编码。否则,, 该工具将使用“接受字符集” 试图提供的请求标头 合适的编码,通常尝试 utf-8,如果客户端未指定 字符集,但遵循RFC 2616和 如果客户端发送了 “接受字符集”标头为空

我可以通过使用如下编码工具来解决此问题:

cherrypy.config["tools.encode.on"] = True
cherrypy.config["tools.encode.encoding"] = "utf-8"
范例

$ curl "http://127.0.0.1:8500/test1"
»
$ curl "http://127.0.0.1:8500/test2"
»
$ curl "http://127.0.0.1:8500/test3"
»
从:

tools.encode:自动转换 来自本机Python的响应 将Unicode字符串格式转换为某种合适的格式 编码(拉丁语-1或UTF-8,例如 示例)


这听起来像是你的答案。

我不知道如何修复它,但如果它有帮助的话:Jinja几乎肯定会返回一个unicode对象
u“»”
,而你的其他方法返回一个长度为2
“\xc2\xbb”
的字符串。看来CherryPy并不期待unicode。谢谢。现在可以了。我还是一个爱开玩笑的新手,我没有注意到这一点。