Unicode —Werkzeugのドキュメント
Unicode
Werkzeugは、HTTP標準がUnicodeに対応していない場合でも、テキストデータが想定されるすべての場所で内部的に文字列を使用します。 基本的に、すべての受信データは文字セット(デフォルトではUTF-8)からデコードされるため、バイトを直接操作することはありません。 送信データはターゲット文字セットにエンコードされます。
PythonのUnicode
あなたがドイツのウムラウトö
を持っていると想像してください。 ASCIIではその文字を表すことはできませんが、latin-1
およびutf-8
文字セットでは表すことができますが、エンコードすると外観が異なります。
>>> "ö".encode("latin1")
b'\xf6'
>>> "ö".encode("utf-8")
b'\xc3\xb6'
ö
はエンコーディングによって外観が異なるため、バイトとして扱うのが困難です。 代わりに、Pythonは文字列をUnicodeテキストとして扱い、ö
のバイトではなく情報LATIN SMALL LETTER O WITH DIAERESIS
を特定のエンコーディングで格納します。 1文字の文字列の長さは1になります。ここで、バイトの長さは他の値である可能性があります。
HTTPのUnicode
ただし、HTTP仕様は、ASCIIバイトがデータの一般的な表現方法であった時代に作成されました。 最新のWebでこれを回避するために、Werkzeugは受信データと送信データを自動的にデコードおよびエンコードします。 ブラウザからWebアプリケーションに送信されるデータは、UTF-8バイトから文字列にデコードされます。 アプリケーションからブラウザに返送されるデータは、UTF-8にエンコードされます。
エラー処理
内部エンコードまたはデコードを行う関数は、str.decode()
およびstr.encode()
に渡されるerrors
キーワード引数を受け入れます。 デフォルトは'replace'
であるため、エラーを簡単に見つけることができます。 エラーをキャッチしてクライアントに不良データを報告するには、'strict'
に設定すると便利な場合があります。
要求オブジェクトと応答オブジェクト
ほとんどの場合、WerkzeugのデフォルトのUTF-8エンコーディングを使用する必要があります。 特定の理由がある場合は、wrappers.Request
とwrappers.Response
をサブクラス化して、エンコードとエラー処理を変更できます。
from werkzeug.wrappers.request import Request
from werkzeug.wrappers.response import Response
class Latin1Request(Request):
charset = "latin1"
encoding_errors = "strict"
class Latin1Response(Response):
charset = "latin1"
エラー処理は、リクエストに対してのみ変更できます。 Werkzeugは、応答のバイトにエンコードするときに常にエラーを発生させます。 ターゲット文字セットに存在しないデータを作成しないのはあなたの責任です。 これはUTF-8の問題ではありません。
ファイルシステム
バージョン0.11で変更されました。
Werkzeugに対するいくつかのバグレポートは、sys.getfilesystemencoding()
の値が従来のUNIXシステムでは信頼できないことを示しています。 通常、これは、LANG
および同様の環境変数が設定されていないシステムの構成ミスが原因で発生します。 このような場合、PythonはファイルシステムエンコーディングとしてデフォルトでASCIIになります。これは非常に保守的なデフォルトであり、通常は間違っており、回避するよりも多くの問題を引き起こします。
Werkzeugは、誤って構成された環境で実行されていることを検出すると、ファイルシステムのエンコーディングがUTF-8
であると見なし、警告を発行します。
werkzeug.filesystem を参照してください。