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

时间:2014-02-26 16:10:04

标签: 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,但有没有可能使它表现得像标准格式提交?

2 个答案:

答案 0 :(得分:8)

您的问题的答案是。你无法改变它。根据{{​​3}},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")

可能有可行的解决方案。如果那就是你想要的,请告诉我。

另一次更新

一点点跑来跑去。 XMLHttpRequest2 TR

所以这就是故事,

1 form with accept-charset="utf8" =&gt;默认行为

内容不需要任何额外的转义/编码。因此,请求将文本原样保存为får løbende

2 form with accept-charset="windows-1251" =&gt;你的情况

内容需要额外的转义/编码,因为此处浏览器的默认字符集是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文本触发。还是没有骰子吗?

我错了,不。仔细看[read =&gt;盯着几分钟....]

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编码状态。使用来自Updated fiddle with all modes的这段精彩代码,像HTML编码一样逃避它是不会有害的。瞧,请求是用文本f&#229;r l&#248;bende

发出的

stackoverflow

希望这有助于清除它!

更新Windows-1251全面支持

привет får løbende输入在早期模式下失败.5。更新小提琴Updated fiddle with all modes

使用此处http://jsfiddle.net/epsSZ/6/和我的解决方案组合。所以问题在于逃避一切。所以现在只转义windows-1251字符集中没有的字符。

这有助于我希望!

答案 1 :(得分: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">

问题是accept-charset是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");

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

祝你好运。 :)