9

这是示例代码(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

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

4

2 回答 2

12

您的问题的答案是否定的。你不能改变它。根据XMLHttpRequest2 TRFormData构造的数据被显式编码为UTF-8. 没有提到允许改变它。

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

去引用,

如果 data 是 FormData 让请求实体主体是运行 multipart/form-data 编码算法的结果,其中 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

3FormData constructed with form element

内容不需要任何额外的转义/编码,因为它默认为utf8. 因此请求以文本为får løbende.

4FormData 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设置了另一种模式,[这就是你要找的,我猜]

5FormData 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/

在此处使用https://stackoverflow.com/a/2711936/1304559和我的解决方案组合。所以问题是逃避一切。所以现在只转义 windows-1251 字符集中不存在的字符。

我希望这会有所帮助!

于 2014-03-20T10:12:25.500 回答
0

谢谢你提出这个问题,我玩得很开心!:)
替换

<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">

问题是接受字符集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");

但这不是解决问题的方法。

祝你好运。:)

于 2014-03-17T19:58:18.623 回答