代码改变世界

[asp.net]控制ajax接收数据的编码格式和避免乱码的方法

2011-11-22 09:30  slmk  阅读(1498)  评论(3编辑  收藏  举报

情况是这样的:很久以前写过一个ajax应用,使用的YUI框架,一直用着没问题,偶尔有用户反映不行,当时简单的归结为RP问题,因为一样的系统,一样版本的浏览器,为什么单单你不行呢?没有深究,可最近,自己遭遇了这种RP问题。问题出在安装了vs2010 express中文版之后,原先的IE6访问该应用时显示乱码。可是用户一个都没反映有问题。Google后没有找到答案,只好自己研究。

首先想到的是编码格式的问题,调试发现在服务器端输出的json数据没有任何乱码,可一到浏览器端中文就会乱掉。检查web.config。发现配置了请求响应的编码格式:

 <globalization requestEncoding="gb2312" responseEncoding="gb2312"/>

大家都知道UTF8才是统一的编码格式,并且是默认格式。然而由于某种原因(要从团队其他成员做的gb2312的页面给我传值),为了图省事,改成了gb2312。建议大家不要用gb2312了,有了utf8,gb2312根本没有用武之地,只会增加出现乱码的情况。其实当初的图省事儿是没有必要的,因为只要在需要接收数据的aspx页面设一下请求的编码格式,就能正确的解码了:

Request.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");

上面的不管用?使用:

 public void Application_BeginRequest(object sender, EventArgs args)
    {
//根据地址选择编码格式,适合于混合两种编码的情况
        Request.ContentEncoding = Encoding.GetEncoding(inputEncoding);
    }

 

指出请求的页面编码是gb2312,请不要再用默认的utf-8解码了。完全不用设置这种全局 globalization。

言归正传,我的ajax应用为什么会出现乱码呢?我想是javascript对gb2312的支持不够智能造成的,javascript对UTF-8的支持应该是比gb2312好。如果由于某种原因,例如可能是安装了某一软件,改变了某些底层的东西,会导致gb2312编码js无法正确解释,而UTF-8却完全不用担心RP问题的出现。

如果继续图省事,也可以在返回json数据之前,设置成UTF8编码:

Response.ContentEncoding = Encoding.UTF8;

这样你的Ajax应用也不会出现乱码了。

 

避免乱码的方法就是整个网站,或者至少是你的团队都用一种编码格式,那就是Utf-8。导致乱码的原因就是编码不一致造成的

IE中随便打开一个网站,你会发现网页编码都是utf-8:

查看源代码,你会发现:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

如果从其它网页导航到你的aspx后,出现了乱码,通常是url传值时(cookie不知道会不会乱),此时不要随便更改你的globalization,如果这样你就被传染了,而是设置Request的ContentEncoding。


自言自语:有些人就是幸运,可能一辈子都不会遇到这种事,而有些人可能注定不幸,经常遭遇RP问题,我想我可能是后一种人,于是才有了这篇儿。
昨天写了这篇:[Asp.net]更新全局程序集缓存的注意事项。没敢发到首页,结果访问量至今为0。

 

提供Silverlight打印全套解决方案全部源代码--支持打印预览、页面设置(横向纵向,页边距,纸张大小、字体大小)、自动分页和多页连续打印