asp.net querystring乱码解决方法

 更新时间:2021年9月22日 10:12  点击:1574

正常的情况下,现在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乱码问题有所帮助。

[!--infotagslink--]

相关文章

  • php生成二维码中文乱码问题解决方法

    最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • 解决HttpPost+json请求---服务器中文乱码及其他问题

    这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22
  • php中iconv编码转换来解决中文乱码的问题

    用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
  • php mail发邮件标题中文乱码的问题解决办法

    本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
  • python os.listdir()乱码解决方案

    在本篇文章里小编给大家整理的是一篇关于python os.listdir()乱码解决方案,对此有兴趣的朋友们可以学习下。...2021-01-31
  • 解决PHPWord导出生成Word中文乱码问题

    PHPWord是一个可以把相关文件生成word文档的插件了,但由于是老外开发的对于gbk支持不好,所以我们在导出带有中文的word时会出现乱码问题,下面本文就PHPWord中文乱码问题...2016-11-25
  • PHP中截取中文乱码解决办法

    如果ASCii码大于0xa0就是半个汉字;了解substr()、mb_substr()、ord()。 现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都...2016-11-25
  • 一次tomcat源码启动控制台中文乱码的调试过程记录

    平时在使用tomcat做一些服务的时候经常遇到各种乱码问题,下面这篇文章主要给大家介绍了一次tomcat源码启动控制台中文乱码的调试过程,需要的朋友可以参考下...2021-06-01
  • iis伪静态中文url出现乱码的解决办法

    这篇文章主要介绍了iis伪静态中文url出现乱码的解决办法,需要的朋友可以参考下...2017-07-06
  • .Net获取URL中文参数值的乱码问题解决方法总结

    这篇文章主要介绍了.Net获取URL中文参数值的乱码问题解决方法,总结分析了针对URL参数传递中出现的乱码问题与相应的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • C# webclient中文乱码问题解决方法

    本文介绍使用webclient抓取远程页面出现乱码的处理方法,希望对大家有所帮助。...2020-06-25
  • redis 解决key的乱码问题,并清理详解

    这篇文章主要介绍了redis 解决key的乱码问题,并清理详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-15
  • php move_uploaded_file 中文乱码问题或上传失败问题

    php是外国人做的,在中文支持上有些地方做得不完美,就在我们文件上传时就发现了,上传中文竟然不成功, 下面我们来看看实例与解决方法吧。 */ $filepath ='upfile/'; if (...2016-11-25
  • asp.net中在用ajax格式传递数据到aspx页面时出现乱码

    asp.net中在用ajax格式传递数据到aspx页面时有时会出现乱码,很是疑惑,不要走开接下来介绍解决方法,感兴趣的朋友可以了解下...2021-09-22
  • 解决PHP中文乱码的4项小技巧

    PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码,中国的 GB2312-...2016-11-25