闲话Ajax传递中文出现乱码
话说前两天吧,一个项目中因为要通过ajax调用ashx(一般处理程序),并传递一连串的参数,这参数里面包含了一些中文,其实之前一直在使用,没发现什么问题,但是这两天突然出现中文转换乱码,出现这样的问题完全是由于对标准的不熟悉,至于网上其它人说的修改jquery文件,使用escape、encodeURI、encodeURIComponent方法,也许可行,但经我测试并未解决问题,可能环境不同也会造成此问题,在这里我不表示反对,除了以后所述,我还测试了其它的方法,比如在requert前后更改编码类型,采用不序列化的方法等,思考的和测试的时间花了不少,说实话,最近园子里的气氛我不太喜欢,不过看到网关关于这问题很少有人在这个角度去分析,所以我还是发首页了。
1、实际的项目代码我就不写了,写点测试的,效果一样,以下是javascript代码。当然应用了JQuery:
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(网上资料很多,这类的作用我就不用说了)
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的编码即可。
<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行,当然,我没有完全剪切出来。
2 url: location.href,
3 global: true,
4 type: "GET",
5 contentType: "application/x-www-form-urlencoded",
6 processData: true,
7 async: true
8}