2

Python 2.7.1、Jinja 2.5.2、および CherryPy 3.1.2 を使用して Web サイトを実行しようとしています。私が使用している 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 に答える