是否可以为新的FormData(XHR2)对象或变通方法设置accept-charset

Dfr*_*Dfr 8 javascript ajax form-data character-encoding xmlhttprequest-level2

这是示例代码(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>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

当我通过标准格式提交提交这种旧方式时,请求有效负载如下所示:

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

f&#229;r l&#248;bende
Run Code Online (Sandbox Code Playgroud)

但是当我提交这种AJAX方式时,它看起来有点不同:

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

får løbende
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在前一种情况下有一些字符被字符实体替换,但是在使用的情况下FormData有普通的字符串,这当然很好,因为它是utf-8,但是有没有可能使它表现得像标准表格提交?

ara*_*ind 8

你的问题的答案是否定的.你无法改变它.根据XMLHttpRequest2 TR,FormData构造的数据被显式编码UTF-8.没有提到允许改变它.

通常的mimeType或Content-Type = charset对于多部分请求变得无效,因为出于完全相同的原因,它的处理方式不同.

报价,

如果数据是FormData让请求实体主体是运行multipart/form-data编码算法的结果,其中数据作为表单数据集并且使用UTF-8作为显式字符编码.

令mime类型为"multipart/form-data;"的串联,U + 0020 SPACE字符,"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(十六进制)= &#229;(十进制).所以基本上escape()是Javascript的做事方式,%基于编码,这不是HTML友好的.

同样&#;,我们知道HTML的编码方式.所以我把另一种模式放到了ajax,[这就是你要找的,我猜]

FormData constructed, and then appended with html-escaped data

内容仍然是utf8编码.使用stackoverflow中的这段精彩代码,像HTML编码一样逃避它是不会有害的.瞧,请求用文本解雇了f&#229;r l&#248;bende

更新了所有模式

希望这有助于清除它!

更新windows-1251全面支持

?????? får løbende输入在早期模式5中失败.更新小提琴http://jsfiddle.net/epsSZ/6/.

在这里使用/sf/answers/189835551/和我的解决方案组合.所以问题在于逃避一切.所以现在只转义windows-1251字符集中没有的字符.

这有助于我希望!