现象如下:
1)在firefox下,处理页面的编码为gb2312,提交数据没有问题,中文能够正确解析;
2)在ie8下,处理页面的编码为gb2312,提交中文数据出现乱码。
无论是$.post还是$.ajax,抑或$.ajaxsubmit(来自于form插件),在之前的utf-8编码的网站都没有出现过任何问题, 看来是由于提交数据的网页的编码格式造成的了。不管怎么样,既然是浏览器之间存在差异,还是从http包来看有什么问题吧。
打开fiddle,分别用firefox和ie做一个ajax提交(以用户登录为例),检查他们的http头,发现
1)两个浏览器提交的form数据是一致的,都是进行了utf-8的编码,如下图所示。
分析:jquery的ajax提交,会将要提交的数据进行编码,使用encodeuricomponent在js中处理数据。因此,无论是 firefox或者ie,提交的数据都是一致的,都是utf-8编码后的数据。
2)查看header,发现entity中的content-type存在差异
在firefox中,content-type指定了字符集为utf-8。
而在ie8中,却没有任何的字符集指定。
分析:显然,默认情况下,ajax的异步提交的字符编码应该和网页本身保持一致,也就是说,server端在没有发现显示的charset指定的情 况下,使用gb2312来解码数据(但是数据在提交前已经被utf-8编码了),这就是为什么在ie下会出现乱码的根源,而在firefox下,浏览器在 提交ajax数据的时候,加上了charset的显示指定,导致server端采用utf-8来解码数据(正确解码)。
推断:看来要解决这个中文乱码问题,就必须给ajax异步提交指定显 示的charset!
马上查阅jquery的ajax工具函数的说明,发现options中有一个指定content-type的参数,给我的ajax代码加上:
复制代码 代码如下:
jquery(form).ajaxsubmit({
url: ajax.aspx?a=memberlogin,
type: post,
datatype: json,
contenttype: application/x-www-form-urlencoded; charset=utf-8,
success: showloginresponse
});
测试,ok!!!