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

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

    1function test() {

    2var content ="{\"Content\":\"*中国人*\"}";

    3$.post("/ashx/Handler1.ashx",

    4{

    5Content: content

    6},

    7function(data) {

    8alert(data);

    9}, "json");

    10}

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

    1public void Proce***equest(HttpContext context)

    2{

    3context.Response.ContentType = "text/plain";

    4string conten = context.Request["Content"];

    5try

    6{

    7DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(News));

    8MemoryStream ms = new MemoryStream(Encoding.GetEncoding("gb2312")。GetBytes(conten));

    9News news = (News)dcs.ReadObject(ms);

    10string c = news.Content;

    11}

    12catch (Exception ex)

    13{

    14throw 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: {

    2url: location.href,

    3global: true,

    4type: "GET",

    5contentType: "application/x-www-form-urlencoded",

    6processData: true,

    7async: true

    8}