这回碰到的情况是prototype.js产生的序列化字符串传递到后台后,乱码的问题。
环境: prototype-1.4.0.js,gb2312编码的jsp ,后台:Linux 2.6.9, resin2., resin的启动参数加了 -Dfile.encoding=ISO-8859-1
在网页提交参数的时候。 用了:
var myAjax = new Ajax.Request(url, {method: 'post', parameters: Form.serialize($('converge')),onComplete: showResponse,onLoaded:doing,onLoading:doing});
其中Form.serialize($('converge')),是把converge表单中所有的字段,拼成method=xxx&type=sss的形式, 在prototype的函数中,会把key和value分别用encodeURIComponent 来把一个字符串转成utf-8的URL编码形式.
比如,“中文”会被编码成:%E4%B8%AD%E6%96%87
但该字符串传到后台时,会被识别成乱码. 用request.getParameter取到的字符串也是乱码,而不是本身的字符。
主要原因是%号,如果该串改成%22E4%22B8%22AD%22E6%2296%2287 也是可以识别的.
解决方法: 在prototype文件中找到 encodeURIComponent 这段, 在encodeURIComponent 后,再将该字符串用escape方法再编码一次。 这时候传到后台,用request.getParameter,可以得到编码后的正确的字符串。即 %E4%B8%AD%E6%96%87 .
这时,可以用java.net.URLDecoder.decode(keyword,"UTF-8"); 对这个字符串进行解码,从而得到正确的中文。