データベースにラテン記号のデータがあるアプリケーションを構築しています。ユーザーはこのデータを入力できます。私がこれまでやってきたことは、テンプレートにデータを表示するときに、すべてのユーザー入力をencode('latin2')し、最後にdecode('latin2')することです。これは少し面倒で、これを処理するためのより良い方法があるかどうか疑問に思っています。
2 に答える
Python のunicode
型は、文字列の「自然な」表現になるように設計されています。タイプに加えてunicode
、文字列は特定されていないエンコーディングであると予想されますが、使用されているエンコーディングで「タグ付け」する方法はなく、Python は文字列が ASCII または UTF-8 エンコーディングであると非常にしつこく想定します。したがって、str
latin2 を意味すると仮定してプログラム全体を作成すると、おそらく頭痛の種になるでしょう。エンコーディングの問題は、コードの奇妙な場所に忍び込み、レイヤーに浸透する方法があり、データベースに不正なデータが含まれることがあり、最終的にはまったく無関係でデバッグが不可能な場所で奇妙な動作や厄介なエラーが発生します.
db データを UTF-8 に変換する方法について確認することをお勧めします。
それができない場合は、データベースとの間でデータを送受信する瞬間までエンコード/デコード呼び出しを移動することを強くお勧めします。なんらかのデータベース抽象化レイヤーがある場合は、おそらくそれを多かれ少なかれ自動的に処理するように構成できます。次に、ユーザー入力がunicode
すぐに型に変換されることを確認する必要があります。
このように型を使用しunicode
、明示的にエンコード/デコードすることには、エンコードの問題がある場合におそらくすぐに気付くことができ、それらにunicode-naziを投げて追跡できるという利点もあります ( How can you make python 2.x を参照)。文字列を Unicode に強制するときに警告しますか? )。
マークアップの問題について: Flask と Jinja2 はデフォルトで、文字列内の安全でない文字を HTML にレンダリングする前にエスケープします。自動エスケープをオーバーライドするには、次の
safe
フィルターを使用します。
<h1>More than just text!</h1>
<div>{{ html_data|safe }}</div>
詳細については、 Flask テンプレート: 自動エスケープの制御を参照してください。データベースから効率的にコードを読み込んで実行するため、これは細心の注意を払って使用してください。実際には、おそらくデータをスクラブしたいと思うでしょう ( Python HTML サニタイザー / スクラバー / フィルターまたはJinja2 で img、b など以外のすべての HTML をエスケープするを参照)。
これをプログラムの先頭に追加してみてください。
import sys
reload(sys)
sys.setdefaultencoding('latin2')
次の理由により、sys をリロードする必要があります。
>>> import sys
>>> sys.setdefaultencoding
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding
<built-in function setdefaultencoding>