asp.net querystring乱码解决方法

所属分类: 网络编程 / ASP.NET 阅读数: 1024
收藏 0 赞 0 分享

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

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

复制代码 代码如下:

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

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

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

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

复制代码 代码如下:

HttpUtility.UrlDecode(s, Encoding.UTF8);

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

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

复制代码 代码如下:

public NameValueCollection QueryString { 
          get {  
              if (_queryString == null) { 
                  _queryString = new HttpValueCollection();  

                  if (_wr != null) 
                      FillInQueryStringCollection();  

                  _queryString.MakeReadOnly(); 
              } 

              if (_flags[needToValidateQueryString]) { 
                  _flags.Clear(needToValidateQueryString);  
                  ValidateNameValueCollection(_queryString, "Request.QueryString");  
              } 

              return _queryString; 
          } 
      } 

复制代码 代码如下:

private void FillInQueryStringCollection() 

    byte[] queryStringBytes = this.QueryStringBytes; 
    if (queryStringBytes != null) 
    { 
        if (queryStringBytes.Length != 0) 
        { 
            this._queryString.FillFromEncodedBytes(queryStringBytes, this.QueryStringEncoding); 
        } 
    } 
    else if (!string.IsNullOrEmpty(this.QueryStringText)) 
    { 
        this._queryString.FillFromString(this.QueryStringText, true, this.QueryStringEncoding); 
    } 

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

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

复制代码 代码如下:

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

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

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

更多精彩内容其他人还在看

开源跨平台运行服务插件TaskCore.MainForm

这篇文章主要为大家详细介绍了开源跨平台运行服务插件TaskCore.MainForm的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

CKEditor自定义按钮插入服务端图片

这篇文章主要为大家详细介绍了CKEditor自定义按钮插入服务端图片的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Asp.net Web Api实现图片点击式图片验证码功能

现在验证码的形式越来越丰富,今天要实现的是在点击图片中的文字来进行校验的验证码。下面通过本文给大家分享Asp.net Web Api实现图片点击式图片验证码功能,需要的的朋友参考下吧
收藏 0 赞 0 分享

WPF实现ScrollViewer滚动到指定控件处

这篇文章主要为大家详细介绍了WPF实现ScrollViewer滚动到指定控件处,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

WPF实现带全选复选框的列表控件

这篇文章主要为大家详细介绍了WPF实现带全选复选框的列表控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Asp.net MVC 中利用jquery datatables 实现数据分页显示功能

这篇文章主要介绍了Asp.net MVC 中利用jquery datatables 实现数据分页显示功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

asp.net 利用NPOI导出Excel通用类的方法

本篇文章主要介绍了asp.net 利用NPOI导出Excel通用类的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

VS2015自带LocalDB数据库用法详解

这篇文章主要为大家详细介绍了VS2015自带LocalDB数据库的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SignalR Self Host+MVC等多端消息推送服务(一)

这篇文章主要为大家详细介绍了SignalR Self Host+MVC等多端消息推送服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SignalR Self Host+MVC等多端消息推送服务(二)

这篇文章主要为大家详细介绍了SignalR Self Host+MVC等多端消息推送服务的第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多