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