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" ,这样的一至编码,即可解决乱码问题

<%@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的数据了。