javascript - 是否可以为新的 FormData (XHR2) 对象或解决方法设置接受字符集

标签 javascript ajax character-encoding form-data 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>

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 变得无效,因为出于完全相同的原因,它们的处理方式不同。

引用,

If data is a FormData Let the request entity body be the result of running the multipart/form-data encoding algorithm with data as form data set and with UTF-8 as the explicit character encoding.

Let mime type be the concatenation of "multipart/form-data;", a U+0020 SPACE character, "boundary=", and the multipart/form-data boundary string generated by the multipart/form-data encoding algorithm.

希望这对您有所帮助!

更新

如果你愿意放弃

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

对于

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

可能会有一个可行的解决方案。如果这就是您要找的东西,请告诉我。

另一个更新

跑来跑去。 Updated fiddle with all modes

这就是故事,

1 accept-charset="utf8"表单 => 默认行为

内容不需要任何额外的转义/编码。因此请求触发时文本完好无损,如 får løbende

2 form with accept-charset="windows-1251" => 你的情况

内容需要额外的转义/编码,因为这里浏览器的默认字符集是utf8。所以内容被转义,然后被触发,即发送的内容是 får løbende

3 用表单元素构造的FormData

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

4 构造FormData,然后追加转义数据

内容仍然是 utf8 编码,但在附加到表单数据之前调用 escape(content) 没有坏处。这意味着请求以 f%E5r%20l%F8bende 文本触发。还是没有骰子吧?

我错了,不。近距离观察[阅读 => 盯着几分钟......]

får løbende

f%E5r%20l%F8bende

然后一切就绪 - %E5(十六进制)= å(十进制)。所以基本上 escape() 是 Javascript 的处理方式,基于 % 的编码,它对 HTML 不友好。

类似&#;,我们知道是HTML的编码方式。所以我为 ajax 提供了另一种模式,[我猜这就是你要找的]

5 构造 FormData,然后附加 html 转义数据

内容还是utf8编码。使用来自 stackoverflow 的这段精彩代码,像 HTML 编码一样转义它并没有什么坏处。 .瞧,用文本 får løbende

触发的请求

Updated fiddle with all modes

希望这有助于清除它!

Windows-1251 全面支持更新

привет får løbende 输入在早期模式 5 中失败。更新 fiddle http://jsfiddle.net/epsSZ/6/ .

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

希望这对您有所帮助!

关于javascript - 是否可以为新的 FormData (XHR2) 对象或解决方法设置接受字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22046930/

相关文章:

javascript - 我需要在jquery代码中调用java方法

javascript - 将 javascript var ="some text"写入预加载但空的 txt 文档中

java.nio.charset.IllegalCharsetNameException : 'ISO-8859-1'

java - Primefaces ajax字符集问题

javascript - 如何在 PEG.js 中制作可选词

javascript - 侧面导航下拉菜单无法使用 Bootstrap 打开

javascript - AJAX - 覆盖提交功能

javascript - 如何使用 AJAX/PHP 获取具有相同 id 动态生成的文本框的值?

c++ - string 如何处理非 ascii 符号而 char 不处理?

javascript - 如何在点击事件中获取图片id