40

Python2.6とJinja2を使用してHTMLレポートを作成しています。テンプレートに多くの結果を提供すると、テンプレートはそれらをループしてHTMLテーブルを作成します

template.renderを呼び出すと、突然このエラーが発生し始めました。

<td>{{result.result_str}}</td>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

奇妙なことに、result.result_strをすべての結果に対して「abc」のような単純なASCII文字列に設定しても、このエラーが引き続き表示されます。私はJinja2とPythonを初めて使用するので、問題を調査して根本的な原因を突き止める方法についてアイデアをいただければ幸いです。

4

7 に答える 7

78

これを追加してみてください:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

それは私の問題を解決しました、幸運。

于 2013-02-17T08:41:54.087 に答える
43

http://jinja.pocoo.org/docs/api/#unicodeから

Jinja2は内部でUnicodeを使用しています。つまり、Unicodeオブジェクトをレンダリング関数またはASCII文字のみで構成されるバイト文字列に渡す必要があります。

したがって、result.result_strを設定する場合は常に、それをユニコードにする必要があります。

result.result_str = unicode(my_string_variable, "utf8")

(バイトがutf8でエンコードされたUnicodeの場合)

また

result.result_str = u"my string"
于 2011-02-18T11:29:06.237 に答える
20

「ABC」のような文字列でエラーが発生した場合は、ASCII以外の文字が別の場所にある可能性があります。テンプレートソースではおそらく?

いずれの場合も、この種の問題を回避するために、アプリケーション全体でUnicode文字列を使用してください。データソースがバイト文字列を提供しているbyte_string.decode('utf-8')場合、文字列がUTF-8でエンコードされていれば、でユニコード文字列を取得します。ソースがファイルの場合はStreamReader、コーデックモジュールのクラスを使用します。

Unicode文字列と通常の文字列の違いがわからない場合は、http://www.joelonsoftware.com/articles/Unicode.htmlをお読みください。

于 2011-02-18T11:27:47.137 に答える
11

Jinja2からの出力をHTMLファイルに保存するコードで同じ問題が発生しました。

with open(path, 'wb') as fh:
    fh.write(template.render(...))

Jinja2のせいにするのは簡単ですが、実際の問題は、open()バージョン2.7の時点でUTF-8をサポートしていないPythonにあります。修正は次のように簡単です。

import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
    fh.write(template.render(...))
于 2014-09-25T15:42:52.477 に答える
5

単純な文字列にはUTF-8文字バイトが含まれる場合がありますが、Unicode型ではありません。これは、strをunicodeに変換する「decode」によって修正できます。Python2.5.5で動作します。

my_string_variable.decode( "utf8")

于 2011-04-17T13:24:47.727 に答える
0

ASCIIは7ビットコードです。値0xC4は7ビットに格納できません。したがって、そのデータに間違ったエンコーディングを使用しています。

于 2011-02-18T11:18:34.993 に答える
-1

またはあなたはするかもしれません

export LANG='en_US.UTF-8'

スクリプトを実行するコンソールで。

于 2013-02-20T12:19:19.153 に答える