我有 ISO-8859-1 数据库,所以我喜欢完全在这个代码页中交换请求。那么,如何正确设置 AJAX 请求的 content-type 呢?
3 回答
尽管这样做很糟糕(上面的一堆评论),但这会起作用:
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
根据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 或您给定的语言中有很多库函数可以做到这一点。否则无法保证符合规范,因此绝对检查/确保后端的编码。
我想我需要解释编码和字符集参数。这些涉及如何解码通过网络发送的原始字节。
例如,考虑内容类型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 中定义了百分比编码的自定义函数,服务器仍然必须在到达时对其进行解码并为数据库进行编码。你没有任何好处。