3

私はMakoにUnicode文字を含む文字列をレンダリングさせようとしています:

tempLook=TemplateLookup(..., default_filters=[], input_encoding='utf8',output_encoding='utf-8', encoding_errors='replace')
...
print sys.stdout.encoding
uname=cherrypy.session['userName']
print uname
kwargs['_toshow']=uname
...
return tempLook.get_template(page).render(**kwargs)

関連するテンプレート ファイル:

...${_toshow}...

出力は次のとおりです。

UTF-8
Deşghfkskhü
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 1: ordinal not in range(128)

文字列自体は問題なく印刷できるので問題ないと思います。

input/output_encodingパラメータとパラメータで(たくさん)遊んだことがありdefault_filtersますが、ASCIIコーデックでデコード/エンコードできないと常に不平を言っています。

そこで、ドキュメントにある例を試してみることにしました。以下が「最適」に機能します。

input_encoding='utf-8', output_encoding='utf-8'
#(note : it still raised an error without output_encoding, despite tutorial not implying it) 

${u"voix m’a réveillé."} 

そして結果は

voix mâ�a réveillé

これが機能しない理由がわかりません。「マジックエンコーディングコメント」も機能しません。すべてのファイルは UTF-8 でエンコードされています。

何時間も無駄に費やしました。何か足りないものはありますか?

アップデート :

私は今、より簡単な質問をしています:

すべての変数が Unicode になったので、何も適用せずに Mako に Unicode 文字列をレンダリングさせるにはどうすればよいでしょうか? 空のフィルター / render_unicode() を渡しても役に立ちません。

4

1 に答える 1

3

はい、UTF-8 != Unicode です。

UTF-8 は、ASCII や ISO 8859-1 と同様に特定の文字列エンコーディングです。これを試して:

任意の入力文字列に対して a inputstring.decode('utf-8')(または取得した入力エンコーディング) を実行します。任意の出力文字列に対してoutputstring.encode('utf-8')(または任意の出力エンコーディング) を実行します。内部で使用する場合は、Unicode 文字列を使用します ( 'this is a normal string'.decode('utf-8') == u'this is a normal string')

'foo'は文字列でu'foo'あり、エンコードを「持たない」(デコードできない) Unicode 文字列です。SO python が通常の文字列のエンコーディングを変更したいときはいつでも、最初にそれを「デコード」しようとし、それを「エンコード」しようとします。そして、デフォルトは「ascii」であり、これは頻繁に失敗します:-)

于 2010-09-19T01:52:12.743 に答える