3

我有 ISO-8859-1 数据库,所以我喜欢完全在这个代码页中交换请求。那么,如何正确设置 AJAX 请求的 content-type 呢?

4

3 回答 3

4

尽管这样做很糟糕(上面的一堆评论),但这会起作用:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", path, false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1')

如果您使用的是 jQuery:https ://stackoverflow.com/a/553572/2527433

于 2013-07-19T18:24:54.380 回答
1

根据XMLHttpRequest.send()的 W3C 规范,在几乎所有情况下,字符集最终都是 UTF-8,具体取决于data的值。即使您指定的任何字符集编码也可能会被 UTF-8 覆盖:

如果 Content-Type 标头在作者请求标头中,并且它的值是一个有效的 MIME 类型,该类型的 charset 参数的值不是不区分大小写的encoding匹配,并且encoding不为 null,则设置该 Content 的所有 charset 参数- 类型标头编码

用户代理有一些回旋余地来确定编码:将包含 AJAX 的页面的编码设置为 ISO-8859-1。然后,UA 将为所有表单提交(除非表单另外指定不同的编码)和可能的 AJAX 提交假定 ISO,这取决于 W3C 算法的解释。

最终,唯一可靠的解决方案是将访问者看到的页面(上面带有 AJAX)设置为 ISO-8859-1,然后确保检查它并在后端转换为 ISO(您需要进行清理在将其发送到数据库之前的所有用户输入,因此只需将此转换添加到流程中)。在 PHP 或您给定的语言中有很多库函数可以做到这一点。否则无法保证符合规范,因此绝对检查/确保后端的编码。

于 2013-07-15T12:27:18.530 回答
0

我想我需要解释编码和字符集参数。这些涉及如何解码通过网络发送的原始字节。

例如,考虑内容类型application/x-www-form-urlencoded和以下数据:

0x61253344254345254232

因为没有字符集(事实上,字符集是这种内容类型的非法参数......)必须假定 ISO-8859-1。因此,在 ISO-8859-1 结果中对上述内容进行解码:

"a%3D%CE%B2"

现在有另一种格式要解码(格式 urlencoded),它有自己的规则。目前的规范说这里的百分比编码必须是 UTF-8,所以在进行string -> string转换之后,你可以从上面得到:

"a=ß"

如您所见,该格式从不使用 ASCII 以外的字符,因此字符集并不重要,也不支持。


您的实际问题与百分比编码使用的编码无关。即使您在 ISO-8859-1 中定义了百分比编码的自定义函数,服务器仍然必须在到达时对其进行解码并为数据库进行编码。你没有任何好处。

于 2013-07-20T14:38:29.727 回答