做网站的时候,因为网站最初设计的时候,没有考虑那么多, 设定了gb2312 的简体中文 作为网站编码。
作为中文用gb2312的编码属很正常的事件了,建站起来也没有什么大问题,包括自己编写JS Ajax也不会产生乱码问题
随着Jquery的流行,我也渐渐喜欢Jquery操作DOM的方法,后来把Jquery文件作为全站的公用JS库。
Jquery的Ajax也挺好用,因为作为公用的文件了,所以不必再为每个需要Ajax的页面,再写什么XMLHTTPrequest这些对象,所以就开始使用Jquery的Ajax.
使用中发现了一些问题:
第一个问题就是load,和Get方法容易缓存,就是每次输出的内容都是一样的,
这个挺好解决的,直接在请求网址后面,加上一个随机数,致使网址不一样,就不会被缓存了。
第二个问题就是乱码问题了,这个问题纠结了我挺时间。经过摸索了一阵,现想出两种方法解决,记录一下,以免忘记了
第一种方法:
把请求的页面,编码存为utf-8文件,同时<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>服务器编码设为65001代表utf-8,最后还要在页面上输出编码也设为 utf-8,即 response.Charset="utf-8" ,这样的一至编码,即可解决乱码问题
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% response.Charset="utf-8" %>
注意,页面保存的时候一定要存为utf-8文件,不然,整个页面都会乱码!
第二种方法:
第二种方法,是修改jquery文件!
我使用的是1.3.2版本的,就以这个为例!
Jquery处理ajax的最主要的一个方法就是:ajax: function( s ) {}
无论是$.load,$.get,$.post 最终都是在这个方法里面处理的,不管其它的,直接去找,为什么Jquery把我们的传递的参数都变成了utf-8编码的数据了,
jquery的 ajax传递的data参数,最后会传递给param: function( a ) {}这个方法,处理,
jquery param是这样写的:
param: function( a ) { var s = [ ];
function add( key, value ){
s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
};
// If an array was passed in, assume that it is an array
// of form elements if ( jQuery.isArray(a) || a.jquery ) // Serialize the form elements jQuery.each( a, function(){ add( this.name, this.value ); }); ........后面的不粘了。
可以看到 s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); 这句代码。
这就是乱码的原因,因为encodeURIComponent这个方法,就是把字符,按照utf-8的编码,把字符进行 URI 组件编码(大家不明白的,可以百度一下)
咱们把这改良一下,让他也可以按gb2312的进行URI编码
var CharsetUtf=true; try{if(a.ParamCharset||a.ParamCharset=="gb2312"){CharsetUtf=false;}}catch(e){}; function add( key, value ){ if(CharsetUtf) {s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);} else {s[ s.length ] = escape(key) + '=' + escape(value);} };
这是我简单的修改了一下,原理是定义一个变量,来确定他是按哪种字符编码来进行URI编码
如果是true,就按utf-8如果为fales,则按gb2312;
默认为true,按utf-8处理!
好下面进行判断!
try{if(a.ParamCharset||a.ParamCharset=="gb2312"){CharsetUtf=false;}}catch(e){};
这句代码的意思是,检测传递进来的数据 a ,是否有ParamCharset这个属性,如果有,再判断他是否等于"gb2312",如果是,再把CharsetUtf改为false;
如果没有,则不处理。
try catch这个是防止,即使数据错误也会按utf-8处理。防止万一的。
好了,写了这么多,现在调用一下试试:
$.post("/zhanHui/ajaxAsp/SearchPageZuiXin.asp"
,{sPageSize:pPageSize,page:pPage,ajaxContent:pAjaxContent,ParamCharset:"gb2312"}
,function(data){
},"json");
按上面代码,只要我们在调用的时候,data参数里面加上一个ParamCharset:"gb2312"
这个参数,传递进去的就是gb2312 的数据了,没用传递这个参数,即传递进去一个utf-8的数据了。