首页 > 代码库 > jquery+asp ajax 中文乱码问题
jquery+asp ajax 中文乱码问题
做网站的时候,因为网站最初设计的时候,没有考虑那么多, 设定了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" ,这样的一至编码,即可解决乱码问题
1 2 3 4 | <%@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是这样写的:
1 | param: function ( a ) { var s = [ ]; |
1 | function add( key, value ){<br> s[ s.length ] = encodeURIComponent(key) + ‘=‘ + encodeURIComponent(value); |
1 | }; |
1 | // If an array was passed in, assume that it is an array |
1 2 3 4 5 6 7 | // 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编码
1 2 3 4 5 6 7 8 | 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处理。防止万一的。
好了,写了这么多,现在调用一下试试:
1 | $.post( "/zhanHui/ajaxAsp/SearchPageZuiXin.asp" |
1 | ,{sPageSize:pPageSize,page:pPage,ajaxContent:pAjaxContent,ParamCharset: "gb2312" } |
1 | , function (data){ |
1 | |
1 | }, "json" ); |
按上面代码,只要我们在调用的时候,data参数里面加上一个ParamCharset:"gb2312"
这个参数,传递进去的就是gb2312 的数据了,没用传递这个参数,即传递进去一个utf-8的数据了。
第三种方法是 客户端 js escape 编码,服务器端 url 解码
http://www.cnblogs.com/choshe/articles/1809114.html