Eli*_*ria 2 python unicode cherrypy character-encoding jinja2
我正在尝试使用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())
Run Code Online (Sandbox Code Playgroud)
jinja2仅适用于Unicode.似乎cherrypy通常在客户端发送no时使用utf-8作为输出编码Accept-Header,但是当它为空时回落到iso-8859-1.
tools.encode.encoding:如果指定,如果无法使用它编码响应,该工具将会出错.否则,该工具将使用'Accept-Charset'请求标头尝试提供合适的编码,如果客户端未指定字符集,通常尝试utf-8,但是如果客户端未遵循RFC 2616并尝试ISO-8859-1发送了一个空的'Accept-Charset'标题.
我可以通过使用这样的编码工具来解决问题:
cherrypy.config["tools.encode.on"] = True
cherrypy.config["tools.encode.encoding"] = "utf-8"
Run Code Online (Sandbox Code Playgroud)
例
$ curl "http://127.0.0.1:8500/test1"
»
$ curl "http://127.0.0.1:8500/test2"
»
$ curl "http://127.0.0.1:8500/test3"
»
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4421 次 |
| 最近记录: |