我有一个ISO-8859-1编码的数据库,因此我希望完全使用这种编码来交换请求。那么,如何正确设置AJAX请求的content-type?
我有一个ISO-8859-1编码的数据库,因此我希望完全使用这种编码来交换请求。那么,如何正确设置AJAX请求的content-type?
var xhr = new XMLHttpRequest();
xhr.open("GET", path, false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1')
用户代理可以确定编码方式:将包含AJAX的页面编码设置为ISO-8859-1。然后,UA将假定所有表单提交使用ISO(除非表单另外指定了不同的编码),并且根据对W3C算法的解释,可能会进行AJAX提交。如果Content-Type头部在作者请求头中,并且其值是具有字符集参数的有效MIME类型,而该参数的值与encoding不区分大小写,则将该Content-Type头部的所有字符集参数设置为encoding。
最终,唯一可靠的解决方案是将访问者所见的页面(其中包含 AJAX)设置为 ISO-8859-1,然后确保在后端检查并转换为 ISO(无论如何,您都需要对发送到数据库之前的所有用户输入进行净化,因此只需将此转换添加到该过程中)。PHP或您使用的语言中有很多库函数可以执行此操作。否则,无法保证符合规范,因此请务必检查/确保后端编码。
我认为我需要解释编码和字符集参数。这些涉及如何解码通过网络发送的原始字节。
例如,考虑内容类型application/x-www-form-urlencoded
和以下数据:
0x61253344254345254232
由于没有字符集(实际上,字符集是此内容类型的非法参数...)必须假定为ISO-8859-1。因此,使用ISO-8859-1对上述内容进行解码的结果如下:
"a%3D%CE%B2"
"a=ß"
正如您所看到的,该格式从未使用ASCII以外的字符,因此字符集并不重要,也不受支持。
你实际的问题与百分号编码使用的编码方式无关。即使你定义了一个自定义函数来使用ISO-8859-1进行百分号编码,服务器在接收到数据后仍然需要对其进行解码并为数据库进行编码。你从中得不到任何好处。