2

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

#!/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())
4

2 回答 2

6

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

tools.encode.encoding:如果指定,如果响应不能用它编码,工具将出错。否则,该工具将使用“Accept-Charset”请求标头来尝试提供合适的编码,如果客户端未指定字符集,通常尝试使用 utf-8,但如果客户端未指定字符集,则遵循 RFC 2616 并尝试 ISO-8859-1发送了一个空的“Accept-Charset”标头。

http://www.cherrypy.org/wiki/BuiltinTools#tools.encode

我可以通过使用这样的编码工具来解决这个问题:

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"
»
于 2011-02-06T19:16:15.413 回答
2

来自CherryPy 教程

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

这听起来像你的答案。

于 2011-02-06T19:17:10.920 回答