Python 2.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が初めてで、根本的な原因に到達するために問題を調査する方法についてのアイデアをいただければ幸いです。
「ABC」などの文字列でエラーが発生した場合は、非ASCII文字が他の場所にある可能性があります。おそらくテンプレートソースで?
いずれの場合でも、この種の問題を回避するには、アプリケーション全体でUnicode文字列を使用します。データソースがバイト文字列を提供している場合、文字列がUTF-8でエンコードされている場合、byte_string.decode('utf-8')
でUnicode文字列を取得します。ソースがファイルの場合、コーデックモジュールのStreamReader
クラスを使用します。
Unicode文字列と通常の文字列の違いがわからない場合は、これを読んでください: http://www.joelonsoftware.com/articles/Unicode.html
これを追加してみてください:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
それは私の問題、幸運を修正しました。
から http://jinja.pocoo.org/docs/api/#unicode
Jinja2はUnicodeを内部で使用しています。つまり、ASCII文字のみで構成されるレンダリング関数またはバイト文字列にUnicodeオブジェクトを渡す必要があります。
したがって、result.result_strを設定する場所はどこでも、ユニコードにする必要があります。
result.result_str = unicode(my_string_variable, "utf8")
(バイトがutf8エンコードされたユニコードの場合)
または
result.result_str = u"my string"
Jinja2からの出力をHTMLファイルに保存するコードで同じ問題が発生しました。
_with open(path, 'wb') as fh:
fh.write(template.render(...))
_
Jinja2を非難するのは簡単ですが、実際の問題はPythonのopen()
にあります。これはバージョン2.7の時点でUTF-8をサポートしていません。修正は次のように簡単です:
_import codecs
with codecs.open(path, 'wb', 'utf-8') as fh:
fh.write(template.render(...))
_
単純な文字列にはUTF-8文字バイトが含まれる場合がありますが、Unicode型ではありません。これは、strをUnicodeに変換する「decode」によって修正できます。 Python 2.5.5。
my_string_variable.decode( "utf8")
ASCIIは7ビットコードです。値0xC4は7ビットで保存できません。したがって、そのデータに間違ったエンコードを使用しています。