新しい FormData (XHR2) オブジェクトまたは回避策に accept-charset を設定することは可能ですか?
-
21-12-2019 - |
質問
コード例は次のとおりです (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år lø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år lø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år løbende
そして
f%E5r%20l%F8bende
それからすべてがうまくいきました - %E5
(16進数) = å
(10 進数)。だから基本的に escape()
JavaScript のやり方です。 %
ベースのエンコーディングであり、HTML には適していません。
同様に &#;
, ご存知のとおり、これは HTML のエンコード方法です。そこで、ajax に別のモードを追加しました [これがあなたが探しているものだと思います]
5 FormData constructed, and then appended with html-escaped data
コンテンツはまだ utf8 エンコードのままです。この素晴らしいコードを使用して、HTML エンコードのようにエスケープしても問題ありません。 スタックオーバーフロー. 。さあ、リクエストがテキストとともに起動されました。 får lø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");
.
しかしこれは問題を修正するものではありません。
頑張ってください。:)