新しい FormData (XHR2) オブジェクトまたは回避策に accept-charset を設定することは可能ですか?

StackOverflow https://stackoverflow.com//questions/22046930

質問

コード例は次のとおりです (http://jsfiddle.net/epsSZ/1/):

HTML:

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
  <label>Label:</label>
  <input type="text" name="label" size="12" maxlength="32" value="får løbende" /><br />
  <input type="submit" value="Send standart">
</form>
<button onclick="sendForm()">Send ajax!</button>

JS:

window.sendForm = function() {
  var oOutput = document.getElementById("output"),
     oData = new FormData(document.forms.namedItem("fileinfo"));
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "/echo/html", true);
  oReq.send(oData);
}

標準フォーム送信を介してこの古い方法で送信すると、リクエストのペイロードは次のようになります。

------WebKitFormBoundary2890GbzEKCmB08rz
Content-Disposition: form-data; name="label"

f&#229;r l&#248;bende

しかし、この AJAX 方法を送信すると、見た目は少し異なります。

------WebKitFormBoundaryPO2mPRFKj3zsKVM5
Content-Disposition: form-data; name="label"

får løbende

ご覧のとおり、前者の場合には、いくつかのcharがキャラクターエンティティに置き換えられますが、使用の場合は FormData プレーン文字列があります。これはutf-8なのでもちろん良いですが、標準フォームの送信のように動作させる可能性はありますか?

役に立ちましたか?

解決

あなたの質問に対する答えは、 いいえ. 。変更することはできません。によると XMLHttpRequest2 TR, FormData 構築されたデータは 明示的に にエンコードされる UTF-8. 。変更を許可することについては何も言及されていません。

通常の mimeType または Content-Type=charset は、まったく同じ理由で異なる方法で処理されるため、マルチパート リクエストでは無効になります。

引用すると、

データがformdataの場合、リクエストエンティティ本文を、フォームデータセットとしてデータを使用して、マルチパート/フォームデータをエンコードするアルゴリズムを実行した結果とします。 明示的な文字エンコーディングとしての UTF-8.

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

お役に立てれば!

アップデート

諦める気があるなら

new FormData(document.forms.namedItem("fileinfo"));

のために

new FormData().append("name", "value")

実行可能な解決策が考えられるかもしれません。それがあなたが探しているものであればお知らせください。

別のアップデート

少しだけ走り回りました。 すべてのモードのフィドルを更新しました

それで、これが物語なのですが、

1 form with accept-charset="utf8" => デフォルトの動作

コンテンツには追加のエスケープ/エンコーディングは必要ありません。したがって、リクエストはテキストをそのままの状態で起動します。 får løbende

2 form with accept-charset="windows-1251" => あなたのケース

ここでのブラウザのデフォルトの文字セットは utf8 であるため、コンテンツには追加のエスケープ/エンコーディングが必要です。したがって、コンテンツはエスケープされてから起動されます。送信された内容は f&#229;r l&#248;bende

3 FormData constructed with form element

デフォルトでは次のとおりであるため、コンテンツには追加のエスケープ/エンコーディングは必要ありません。 utf8. 。したがって、リクエストは次のようなテキストで起動されます får løbende.

4 FormData constructed, and then appended with escaped data

コンテンツはまだ utf8 エンコーディングのままですが、呼び出しても問題ありません。 escape(content) フォームデータに追加する前に。これは、次のようなテキストでリクエストが起動されることを意味します。 f%E5r%20l%F8bende. 。まだサイコロはないですよね?

いや、私は間違っていました。もっと近づいて見て[読む => 数分間見つめて....]

f&#229;r l&#248;bende そして

f%E5r%20l%F8bende

それからすべてがうまくいきました - %E5 (16進数) = &#229; (10 進数)。だから基本的に escape()JavaScript のやり方です。 % ベースのエンコーディングであり、HTML には適していません。

同様に &#;, ご存知のとおり、これは HTML のエンコード方法です。そこで、ajax に別のモードを追加しました [これがあなたが探しているものだと思います]

5 FormData constructed, and then appended with html-escaped data

コンテンツはまだ utf8 エンコードのままです。この素晴らしいコードを使用して、HTML エンコードのようにエスケープしても問題ありません。 スタックオーバーフロー. 。さあ、リクエストがテキストとともに起動されました。 f&#229;r l&#248;bende

すべてのモードのフィドルを更新しました

これが問題を解決するのに役立つことを願っています!

Windows-1251 完全サポートの更新

これ привет får løbende 以前のモード 5 では入力が失敗していました。フィドルを更新する http://jsfiddle.net/epsSZ/6/.

ここでソリューションを組み合わせて使用​​します https://stackoverflow.com/a/2711936/1304559 私の物と。したがって、問題はすべてをエスケープすることです。したがって、Windows-1251 文字セットに存在しない文字のみをエスケープするようになりました。

これは役に立ちますように!

他のヒント

この質問をありがとう、私は自分自身を楽しんだ!:)

を交換してください
<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
.

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="utf-8">
.

問題はaccept-charsetがwindows-1251

の代わりにutf-8です。

の後
oReq.open("POST", "/echo/html", true);
.

を追加することもできます
oReq.overrideMimeType('text/html; charset=UTF-8');
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
.

しかしこれは問題を修正するものではありません。

頑張ってください。:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top