13

文字セットが指定されていない場合にmultipart/form-dataをデコードするために使用する必要があるデフォルトのエンコーディングは何ですか?RFC2388は次のように述べています。

4.5フォームデータのテキストの文字セット

multipart / form-dataの各部分は、content-typeを持つことになっています。フィールド要素がテキストの場合、テキストのcharsetパラメーターは、使用される文字エンコードを示します。

たとえば、ユーザーが「Joe owes <eu> 100」と入力したテキストフィールドを持つフォーム(<eu>はユーロ記号)では、フォームデータが次のように返される場合があります。

--AaB03x
content-disposition: form-data; name="field1"
content-type: text/plain;charset=windows-1250
content-transfer-encoding: quoted-printable>>

Joe owes =80100.
--AaB03x

私の場合、文字セットが設定されておらず、そのテキスト/プレーンセクション内のデータをデコードする方法がわかりません。標準的な動作ではないものを強制したくないので、この場合に予想される動作は何かを尋ねています。RFCはこれを説明していないようですので、私はちょっと迷っています。

ありがとうございました!

4

3 に答える 3

10

これはHTML5で明らかに変更されています(http://dev.w3.org/html5/spec-preview/constraints.html#multipart-form-dataを参照)。

非ファイルフィールドに対応する生成されたmultipart/form-dataリソースの部分には、Content-Typeヘッダーを指定してはなりません。

では、文字セットはどこに指定されていますか?エンコーディングアルゴリズムからわかる限り、唯一の場所は_charset_という名前のフォームデータセットエントリ内です。

フォームに_charset_という名前の非表示の入力がない場合、どうなりますか?これをChrome28でテストし、UTF-8でエンコードされたフォームとISO-8859-1でエンコードされたフォームを送信し、送信されたヘッダーとペイロードを調べましたが、どこにも文字セットが指定されていません(テキストのエンコードは確実に変更されていますが) )。フォームに空の_charset_フィールドを含めると、Chromeはそのフィールドに正しい文字セットタイプを入力します。サーバー側のコードは、それを理解するためにその_charset_フィールドを探す必要があると思いますか?

FormDataオブジェクトのXMLHttpRequest.sendを使用するChrome拡張機能を作成しているときにこの問題が発生しました。この拡張機能は、ソースドキュメントのエンコードに関係なく常にUTF-8でエンコードされます

リクエストエンティティの本体を、データをフォームデータセットとして、utf-8を明示的な文字エンコードとして使用してmultipart/form-dataエンコーディングアルゴリズムを実行した結果とします。

mimeタイプを、「multipart / form-data;」、U + 0020 SPACE文字、「boundary =」、およびmultipart/form-dataエンコーディングアルゴリズムによって生成されたmultipart/form-data境界文字列の連結とします。

前に見つけたように、フォームに空の_charset_フィールドを含めない限り、charset=utf-8はPOSTリクエストのどこにも指定されません。この場合は自動的に「utf-8」が入力されます。

これが私の理解です。私の仮定の修正を歓迎します!

于 2013-07-23T18:48:35.913 に答える
7

HTTP 1.1のデフォルトの文字セットはISO-8859-1(Latin1)ですが、これはここでも当てはまると思います。

3.7.1正規化とテキストのデフォルト

- をちょきちょきと切る -

「charset」パラメータは、データの文字セット(セクション3.4)を定義するために一部のメディアタイプで使用されます。送信者が明示的な文字セットパラメータを指定しない場合、「テキスト」タイプのメディアサブタイプは、HTTP経由で受信したときにデフォルトの文字セット値「ISO-8859-1」を持つように定義されます。「ISO-8859-1」またはそのサブセット以外の文字セットのデータには、適切な文字セット値でラベルを付ける必要があります。互換性の問題については、セクション3.4.1を参照してください。

于 2010-11-03T10:25:32.057 に答える
2

@owlmanによる詳細な説明に感謝します。

ここにもう少し情報があります:

リクエストペイロードフラグメントのアップロード:

------WebKitFormBoundarydZAwJIasnBbGaUqM
Content-Disposition: form-data; name="file"; filename="xxx.txt"
Content-Type: text/plain

「xxx.txt」にUTF-8エンコーディングを使用するUNICODE文字が含まれている場合、Resin(4.0.40以降)は正しくデコードできませんが、Jetty(9.x)はデコードできます。

Resinの動作の理由は、Content-typeがエンコーディングを指定していないためだと思います。そのため、Resinは「ISO8859-1」を使用してファイル名をデコードします。これにより、文字が文字化けする可能性があります。

私はグーグルをしました:

https://mail-archives.apache.org/mod_mbox/struts-user/200310.mbox/%3C3FA0395B.1080209@kumachan.net.nz%3E

Resinの動作はサーブレット仕様2.3に準拠しているようです。

また、 http://www.caucho.com/resin-4.0/reference.xtpから 、Resinのこの動作を変更できる設定が見つかりません。

于 2016-07-25T09:31:26.517 に答える