Greasemonkey与需要windows-1250编码的服务器通信

时间:2009-12-04 09:15:28

标签: javascript http character-encoding xmlhttprequest greasemonkey

我正在开发一个 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中输出。

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

让Firefox编码URL的另一种方法是将其设置为链接的href。属性(NOT属性)将始终作为页面编码中urlencoded的绝对链接回读。

对于GET请求,您只需将href设置为http://server/cgi?var=value并回读编码的表单。对于POST请求,您必须采取额外步骤来分隔数据(您不能单独使用?var=value,因为链接将作为绝对链接回读)。

答案 1 :(得分:1)

让浏览器对表单进行编码。将它放在一个隐藏的iframe中并在其上调用submit()。