ASP.NET QueryString乱码解决问题
创始人
2024-04-21 16:11:54
0

正常的情况下,现在asp.net的网站很多都直接使用UTF8来进行页面编码的,这与Javascript、缺省网站的编码是相同的,但是也有相当一部分采用GB2312。

对于GB2312的网站如果直接用javascript进行ajax数据提交,例如:http://www.xxx.com/accept.aspx?name=张三,或者说在UTF8的网站上用以下asp.net的代码进行提交,也是不行的,会导致querystring乱码。

  1. WebRequest request = WebRequest.Create("http://www.xxx.com/accept.aspx?name=张三");  
  2.         request.Method = "POST";  
  3.         HttpWebResponse response = (HttpWebResponse)request.GetResponse();  
  4.  

这样在GB2312编码的网站下得到Request.QueryString["name"]是乱码,MS已经把编码转换这块封装好了。

在UTF8编码通讯和GB2312网站通讯方式下的编码转换方式有很多种实现:

第一种:首先对要传输的字符进行UrlEncode,这种编码后的字符在解码时用UTF8编码方式进行手工解码,这样保证结果一致,即使传输给的目标页面时GB2312,结果都是一样的,避免了querystring乱码。解码方式如下代码。

  1. HttpUtility.UrlDecode(s, Encoding.UTF8); 

这样可以得到正确的张三,这要求在提交的时候先进行HttpUtility.UrlEncode编码成UTF8先,然后再放到name=(编码后的字符),这也是目前比较常用和普遍的解决方式,只是缺点有一个就是要告诉别人你先怎么怎么Url编码先,然后再怎么怎么。

第二种:比较另类一些,直接读取客户端提交的字节数据进行转换,之所以Request.QueryString["name"]会是乱码,是MS根据当前页面的编码进行转换导致的,例如当前页面编码是GB2312,而人家提交的是UTF8,你没用人家提交的UTF8编码转当然是乱码,并不是人家传过来就是乱码。这时我们需要得到原始数据进行重新解码来避免querystring乱码,非常遗憾的是我并没有找到直接提供头部原始字节数据方法给我们用,没关系,解剖下MS的源代码,发现代码如下:

  1. public NameValueCollection QueryString {  
  2.           get {   
  3.               if (_queryString == null) {  
  4.                   _queryString = new HttpValueCollection();   
  5.  
  6.                   if (_wr != null)  
  7.                       FillInQueryStringCollection();   
  8.  
  9.                   _queryString.MakeReadOnly();  
  10.               }  
  11.  
  12.               if (_flags[needToValidateQueryString]) {  
  13.                   _flags.Clear(needToValidateQueryString);   
  14.                   ValidateNameValueCollection(_queryString, "Request.QueryString");   
  15.               }  
  16.  
  17.               return _queryString;  
  18.           }  
  19.       }  

 

  1. private void FillInQueryStringCollection()  
  2. {  
  3.     byte[] queryStringBytes = this.QueryStringBytes;  
  4.     if (queryStringBytes != null)  
  5.     {  
  6.         if (queryStringBytes.Length != 0)  
  7.         {  
  8.             this._queryString.FillFromEncodedBytes(queryStringBytes, this.QueryStringEncoding);  
  9.         }  
  10.     }  
  11.     else if (!string.IsNullOrEmpty(this.QueryStringText))  
  12.     {  
  13.         this._queryString.FillFromString(this.QueryStringText, true, this.QueryStringEncoding);  
  14.     }  
  15. }  

顺便说一下,QueryString是在第一次被访问时才初始化的,如果你的程序中没有用到它,那个这个对象会一直保持空值,MS考虑了细节

大家都看到了QueryStringBytes属性,原型如下internal byte[] QueryStringBytes,这个就是原始的QueryString字节了。出招了:

  1. Type type = Request.GetType();  
  2.         PropertyInfo property = type.GetProperty("QueryStringBytes",  
  3.             BindingFlags.Instance  | BindingFlags.IgnoreCase | BindingFlags.NonPublic);  
  4.         byte[] queryBytes = (byte[])property.GetValue(Request, null);  
  5.         string querystring = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8);  

再看看querystring是什么,哈哈name=张三。

各种编码的转换都可以自己完成,毕竟得到提交的原始字节了,希望对大家解决querystring乱码问题有所帮助。

【编辑推荐】

  1. ASP.NET DetailsView中显示选中产品的详细信息
  2. ASP.NET 2.0数据教程:GridView选择行
  3. ASP.NET 2.0数据教程:GridView显示数据
  4. ASP.NET 2.0中添加GridView到页面
  5. 新增ASP.NET页面时的注意事项

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...