我正在开发一个 greasemonkey 插件,该插件应该在不受我控制的应用程序上使用 POST (GM_xmlhttpRequest) 在后台发送表单。该应用程序是用 PHP 编写的,并且似乎期望其所有输入都采用 windows-1250 编码。我需要做的就是按原样保留所有表单字段,仅编辑其中之一并重新提交。某些字段使用重音字符并且长度有限。
理论上这不是问题 - 我迭代所有表单字段,对值使用encodeURIComponent 函数并将所有内容连接到发布请求正文。然而。 encodeURIComponent 函数始终根据 UTF-8 对字符进行编码,这会导致各种问题。因为 PHP 似乎没有正确地重新编码我对 windows-1250 的请求,所以它会误解多字节字符串,并得出结论:重新提交的值比允许的 40 个字符长,所以我就死掉了。或者脚本只是默默地死掉,没有给我任何有用的反馈。
我通过查看当我在浏览器窗口中提交表单时 Firefox 发送的 POST 正文,然后使用 xhr 将相同的数据重新发送到服务器来测试这一点。这有效。例如字符串:
Zajišťujeme profesionální modelky
当由encodeURIComponent编码时,如下所示:
Zaji%C5%A1%C5%A5ujeme%20profesion%C3%A1ln%C3%AD%20modelky
在 PHP(windows-1250 中的源文本)或 Firefox 中使用 urlencode 时,效果相同:
Zaji%9A%9Dujeme+profesion%E1ln%ED+modelky
显然,我需要对帖子正文进行编码,就像在 windows-1250 中一样,或者以某种方式使服务器接受 utf-8 (我怀疑这是可能的)。我尝试了各种其他函数,例如 escape 或encodeURI,但输出没有太大不同 - 似乎都以 utf-8 输出。
有什么办法可以解决这个问题吗?
最佳答案
让 Firefox 对 URL 进行编码的另一种方法是将其设置为链接的 href。该属性(非属性)将始终作为页面编码中 urlencoded 的绝对链接读回。
对于 GET 请求,您只需将 href 设置为 http://server/cgi?var=value
并读回编码形式。对于 POST 请求,您必须采取额外的步骤来分离数据(您不能单独使用 ?var=value
,因为链接会作为绝对链接读回)。
关于javascript - Greasemonkey 与需要 windows-1250 编码的服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1845804/