MultiPart/Form-Data、フィールドのデフォルトのcharSetは何ですか?
-
28-09-2019 - |
質問
charsetが与えられていない場合、マルチパート/フォームデータをデコードするために使用するデフォルトのエンコードは何ですか? RFC2388の状態:
4.5フォームデータのテキストのcharset
MultiPart/Form-Dataの各部分には、コンテンツタイプがあることになっています。フィールド要素がテキストである場合、テキストのcharsetパラメーターは、使用される文字エンコードを示します。
たとえば、ユーザーが「Joeが借りている」と入力したテキストフィールドを持つフォームu003Ceu>100 'ここでu003Ceu>ユーロシンボルには、フォームデータが返されている可能性があります。
--AaB03x content-disposition: form-data; name="field1" content-type: text/plain;charset=windows-1250 content-transfer-encoding: quoted-printable>> Joe owes =80100. --AaB03x
私の場合、charsetは設定されておらず、そのテキスト/プレーンセクション内のデータをデコードする方法がわかりません。私は標準的な動作ではないものを実施したくないので、この場合、予想される動作が何であるかを尋ねています。 RFCはこれを説明していないようですので、私はちょっと迷っています。
ありがとうございました!
解決
のデフォルトのチャーセット HTTP 1.1 ISO-8859-1(LATIN1)、これもここにも当てはまると思います。
3.7.1標準化とテキストのデフォルト
- をちょきちょきと切る -
「charset」パラメーターは、一部のメディアタイプで使用され、データの文字セット(セクション3.4)を定義します。送信者によって明示的なcharsetパラメーターが提供されない場合、「テキスト」タイプのメディアサブタイプは、HTTPを介して受信した場合、「ISO-8859-1」のデフォルトのcharSet値を持つように定義されます。 「ISO-8859-1」以外の文字セットのデータまたはそのサブセットには、適切な憲章値をラベル付けする必要があります。互換性の問題については、セクション3.4.1を参照してください。
他のヒント
これは明らかにHTML5で変化しています(参照してください http://dev.w3.org/html5/spec-preview/constraints.html#multipart-form-data).
非ファイルフィールドに対応する生成されたマルチパート/フォームデータリソースの部分には、コンテンツタイプのヘッダーが指定されていない必要があります。
では、文字セットはどこで指定されていますか?エンコーディングアルゴリズムからわかる限り、唯一の場所はフォームデータセットエントリ内です。 _文字コード_.
フォームに名前の隠された入力がない場合 _文字コード_, 、 何が起こるのですか? Chrome 28でこれをテストし、UTF-8とISO-8859-1でエンコードされたフォームを送信し、送信されたヘッダーとペイロードを検査しましたが、Charsetはどこにも与えられていません(エンコードのテキストが間違いなく変更されていても、 )。空を含める場合 _文字コード_ フォームのフィールドでは、Chromeはそれを正しいチャーセットタイプで入力します。サーバー側のコードはそれを探す必要があると思います _文字コード_ それを理解するフィールド?
xmlhttprequest.sendを使用するChrome拡張機能を書きながら、この問題に遭遇しました formdata オブジェクト、それ ソースドキュメントエンコードが何であれ、常にUTF-8でエンコードされます.
リクエストエンティティボディを、フォームデータセットとしてデータを使用して、明示的な文字エンコードとしてUTF-8を使用して、マルチパート/フォームデータエンコードアルゴリズムを実行した結果とします。
MIMEタイプを、「MultiPart/Form-Data」、U+0020スペース文字「Boundary =」、およびMultiPart/Form-Dataエンコードアルゴリズムによって生成されたMultiPart/Form-Data境界文字列の連結とします。
前に見つけたように、charset = utf-8は、空の要求を含めない限り、POSTリクエストのどこにも指定されていません _文字コード_ この場合、「UTF-8」が自動的に入力される形式のフィールド。
これが物事の状態についての私の理解です。私の仮定の修正を歓迎します!
@owlmanの詳細な説明に感謝します。
ここにいくつかの情報があります:
リクエストペイロードフラグメントをアップロードします:
------WebKitFormBoundarydZAwJIasnBbGaUqM
Content-Disposition: form-data; name="file"; filename="xxx.txt"
Content-Type: text/plain
「xxx.txt」にUTF-8エンコードを使用してユニコードチャーがいくつかある場合、樹脂(4.0.40の時点で)は正しくデコードできませんが、jetty(9.x)はできます。
樹脂の動作の理由は、コンテンツタイプがエンコードを指定していないため、「ISO8859-1」を使用して樹脂デコードファイル名をデコードし、その結果、文字化された文字になる可能性があることだと思います。
私はいくつかのグーグルをしました:
樹脂の挙動はサーブレット仕様2.3に従っているようです
から設定が見つかりません http://www.caucho.com/resin-4.0/reference.xtp樹脂のこの動作を変える可能性があります。