这是示例代码(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,但是是否有可能使其行为像标准表单提交一样?

有帮助吗?

解决方案

你的问题的答案是 . 。你无法改变它。根据 XMLHttpRequest2 TR, FormData 构建的数据是 明确地 编码为 UTF-8. 。没有提到允许更改它。

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

去引用,

如果数据是formData,请让请求实体主体是运行多出/form-data编码算法的结果 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 (十六进制)= &#229; (十进制)。所以基本上 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">

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