是否可以为新的 FormData (XHR2) 对象或解决方法设置接受字符集
-
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
如您所见,在以前的情况下,有些炭被角色实体取代,但在使用的情况下 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å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
(十六进制)= å
(十进制)。所以基本上 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">
问题是接受字符集是 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");
但这并不能解决问题。
祝你好运。:)