我有ISO-8859-1数据库,所以我想在这个代码页中完全交换请求。那么,如何以正确的方式为AJAX请求设置内容类型?
答案 0 :(得分:2)
尽管这样做很糟糕(上面的一堆评论),但这可行:
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
答案 1 :(得分:1)
根据XMLHttpRequest.send()的W3C规范,几乎在所有情况下,字符集最终都将成为UTF-8,具体取决于 data 的值。即使您指定的任何字符集编码也可能会被UTF-8覆盖:
如果Content-Type标头位于作者请求标头中,并且其值是具有charset参数的有效MIME类型,该参数的值不是 encoding 的不区分大小写的匹配项,并且 encoding 不为null,将该Content-Type标头的所有charset参数设置为 encoding 。
用户代理有一些摆动空间来确定编码:将包含AJAX的页面的编码设置为ISO-8859-1。然后,UA将对所有表单提交采用ISO(除非表单另有指定不同的编码),并且可能是AJAX提交,具体取决于对W3C算法的解释。
最终,唯一可靠的解决方案是将访问者看到的页面(使用AJAX)设置为ISO-8859-1,然后确保检查它并在后端转换为ISO(你< strong>需要在将所有用户输入发送到数据库之前对其进行消毒,因此只需将此转换添加到流程中即可。有很多库函数可以用PHP或您的语言来完成。否则无法保证与规范的一致性,所以绝对检查/确保后端的编码。
答案 2 :(得分:0)
我想我需要解释编码和charset参数。这些关注原始字节如何 通过网络发送应该被解码。
例如,请考虑内容类型application/x-www-form-urlencoded
和以下数据:
0x61253344254345254232
因为没有字符集(事实上,charset是此内容类型的非法参数...)ISO-8859-1 必须假设。因此,在ISO-8859-1中解码上述结果:
"a%3D%CE%B2"
现在还有另一种解码格式(表单urlencoded),它有自己的规则。 The current specs say that the percent encoding here must be UTF-8,所以做完 string - &gt;你得到的字符串转换 从上面:
"a=ß"
正如您所看到的,格式从不使用ASCII以外的字符,因此字符集并不重要 反正不支持。
您的实际问题与百分比编码使用的编码无关。即使您定义了百分比编码的自定义函数 在ISO-8859-1中,服务器仍然必须在到达时对其进行解码并对数据库进行编码。你有 没法从中获益。