日期:2014-05-16  浏览次数:20755 次

【转】jQuery Ajax提交表单乱码问题的解决

【原文】http://m.oschina.net/blog/94095

?

? ? ? ? 同事请求帮忙,说程序好好的,忽然就在提交表单的时候乱码了。本着助人为乐的精神,去看了一下。了解了一下情况后开始调试。?
发现请求提交到后台的时候中文已经变成了乱码。检查web.xml, 发现有编码转换的Filter, 检查页面,编码是UTF-8,检查request的编码,也是UTF-8,编码都是一致的。就是提交到后台的时候乱码。?
试着把取到的乱码进行转码,发现如下的情况可以正常获得中文:

new String(name.getBytes("iso-8850-1"), "utf-8")

接近崩溃的边缘了。再查Post到后台的数据,中文也是UTF-8的编码。

开始百度,有人说在jQuery中设置ajaxSettings的contentType属性,在后面加上”;charset=utf-8”

ajaxSettings: {
    url: ajaxLocation,
    isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
    global: true,
    type: "GET",
    contentType: "application/x-www-form-urlencoded;charset=utf-8",
    processData: true,
    async: true,
            ......
  }

试着改了之后,发现果然可以解决问题。

但是总觉得这么解决问题有点怪怪的,jQuery那么多人用,为啥非要指定这个utf-8的编码呢,如果项目用的不是utf-8呢??
回到自己的位子继续研究。项目中用的是Spring的CharacterEncodingFilter, 懒得下源码,于是自己写了个EncodingFilter加在前面,发现request.getCharacterEncoding()返回的是null,于是手动设置了一下编码为utf-8, 再getParameter, 发现是正常的中文。

此处省去部分文字……

在javaEE的文档里,对于setCharacterEncoding的解释是这样的:

Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effect.

最后发现是Filter的顺序问题导致。在encodingFilter之前配置了其他的Filter,刚好在那里调用了get方法,调整之后,一切恢复正常。