闲话Ajax传递中文出现乱码

    话说前两天吧,一个项目中因为要通过ajax调用ashx(一般处理程序),并传递一连串的参数,这参数里面包含了一些中文,其实之前一直在使用,没发现什么问题,但是这两天突然出现中文转换乱码,出现这样的问题完全是由于对标准的不熟悉,至于网上其它人说的修改jquery文件,使用escape、encodeURI、encodeURIComponent方法,也许可行,但经我测试并未解决问题,可能环境不同也会造成此问题,在这里我不表示反对,除了以后所述,我还测试了其它的方法,比如在requert前后更改编码类型,采用不序列化的方法等,思考的和测试的时间花了不少,说实话,最近园子里的气氛我不太喜欢,不过看到网关关于这问题很少有人在这个角度去分析,所以我还是发首页了。

 1、实际的项目代码我就不写了,写点测试的,效果一样,以下是javascript代码。当然应用了JQuery:

 1function test() {
 2    var content ="{\"Content\":\"*中国人*\"}";
 3    $.post("../ashx/Handler1.ashx",
 4        {
 5            Content: content
 6        }
,
 7        function(data) {
 8            alert(data);
 9        }
"json");
10}

 

2、后台序列化代码,应用了.net framework3.5 的新功能 DataContractJsonSerializer(网上资料很多,这类的作用我就不用说了)

 1  public void ProcessRequest(HttpContext context)
 2        {
 3            context.Response.ContentType = "text/plain";
 4            string conten = context.Request["Content"];
 5            try
 6            {
 7                DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(News));
 8                MemoryStream ms = new MemoryStream(Encoding.GetEncoding("gb2312").GetBytes(conten));
 9                News news = (News)dcs.ReadObject(ms);
10                string c = news.Content;
11            }

12            catch (Exception ex)
13            {
14                throw ex;
15            }

16        }

 

分析:

3、上面的这段代码注定要抛出一个序列化字符串包含无效字符的异常。

4、但是当我在客户端传递的:“中国人”改成“中国人民”后,异常消失。

5、 为什么呢为什么呢?原因说起来相当的简单和傻冒,为什么是奇数字符异常而偶数却不会?说起来这历史相当遥远,却是由于javascript的编码造成,或者也可以说是项目的编码环境造成的,javascript默信采用的"utf-8" ISO 1的编码,将所有中文字符转换为3个字节,而utf-8及gb2312却是将所有中文字符转换为2字节,这一转手,得,情况突变,3字节变成2字节,乱码随之而来。

6、其实是因为在项目中应用的是:gb2312编码,在web.config中更改即可,其实只要更改requesEncoding的编码即可。

    <system.web>
                 
<globalization requestEncoding="utf-8" responseEncoding="gb2312" fileEncoding="gb2312"/>
        
</system.web>

 7、其实在这之前,我检查了JQuery的编码应用,它里面并没有规定使用什么样的编码,不需要去更改源文件,这是jquery-1.3.2.js和jquery-1.3.2-vsdoc2.js中的设置。

位于jquery-1.3.2.js中的3362行,当然,我没有完全剪切出来。

1ajaxSettings: {
2        url: location.href,
3        globaltrue,
4        type: "GET",
5        contentType: "application/x-www-form-urlencoded",
6        processData: true,
7        async: true
8}

 

posted @ 2009-10-29 19:22  Ron.Liang  阅读(3917)  评论(7编辑  收藏  举报