正常的情况下,现在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();

这样在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. if (_wr != null)
  6. FillInQueryStringCollection();
  7. _queryString.MakeReadOnly();
  8. }
  9. if (_flags[needToValidateQueryString]) {
  10. _flags.Clear(needToValidateQueryString);
  11. ValidateNameValueCollection(_queryString, "Request.QueryString");
  12. }
  13. return _queryString;
  14. }
  15. }
  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乱码问题有所帮助。

(转)ASP.NET QueryString乱码解决问题的更多相关文章

  1. ASP.NET QueryString乱码解决问题

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

  2. asp.net url参数中有中文request.querystring 乱码

    说明: 从这点我们发现:所有的参数输入,都调用了一次:HttpUtility.UrlDecode(str2, encoding); 结论出来了: 当客户端js对中文以utf-8编码提交到服务端时,用R ...

  3. ASP源代码中文乱码怎么办

    ASP程序如果是UTF-8编码格式将会乱码,将其转换为ASCII码即可 如图所示

  4. Asp.net QueryString批量插入和更新

    public static string InsertOrUpdateQueryString(string[] keys, string[] values) { return InsertOrUpda ...

  5. jenkins乱码解决问题

    1.jenkins控制台线上乱码解决 系统管理——系统设置,添加编码环境变量 zh.CH.UTF-8 2.java启动后,tomcat日志显示乱码,原因是环境变量没有带过去,因此shell脚本头部需要 ...

  6. Asp Url汉字乱码的问题

    1.js <a target="_blank" href="/asp/download.asp?File=' + escape(item.FileName) + ' ...

  7. zabbix超级乱码解决问题

    个人而言,网上那些方法并不顶什么用,研究了一番总结出了自己的一个方法. 像这种,出现了严重乱码,也不是像网上说的那样把楷体复制过去就好.事实证明我复制过去好多次了,然而并没有什么用. 下面是我自己总结 ...

  8. jsp里post和get的乱码解决问题

    6.乱码问题01:<%reques.setCharacterEncoding("utf-8");%> 02:get请求乱码 001.:String 编码之后的字符串 = ...

  9. Ajax的乱码解决问题?

    Javascript是使用UTF-8国际编码,即每个汉字用4个字节来存储,这就造成了用AJAX来send数据的时候出现会乱码. Ajax乱码产生主要有2个原因 1. XMLHttpRequest返回的 ...

随机推荐

  1. Oracle core06_latch&lock

    lock and latch 在oracle中为了保护共享资源,使用了两种不同的锁机制lock和latch,这两种锁有明显不同点: 1,lock和pin,采用的是队列的方式,先来先服务的策略,latc ...

  2. poj1741 bzoj2152

    树分治入门 poj1741是男人八题之一,经典的树分治的题目这里用到的是点分治核心思想是我们把某个点i作为根,把路径分为过点i和不过点i先统计过点i这样的路径数,然后在统计其子树中的答案,这样就不断地 ...

  3. C#下多进程共同读写同一文件

    最近遇到这样一个需求,用C#写一个界面,在界面上实时输出一个日志文件. 实时检测文件变化,以便刷新界面显示,可以用FileSystemWatcher组件,响应Changed事件即可. 关键是在Chan ...

  4. GeoServer地图开发解决方案

    转自:http://www.cnblogs.com/beniao/archive/2011/01/08/1930822.html GeoServer 是 OpenGIS Web 服务器规范的 J2EE ...

  5. (转载)JS事件监听 JS:attachEvent和addEventListener使用方法

    (转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...

  6. Castle学习系列之二:Castle配置

    说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之. 主要内容 1.Castle配置学习 2.初始化配置 Castle配置学习 <?xml ...

  7. (转载)TRS的WCM6漏洞权限绕过以及绕过密码的登陆方式

    转载于:http://www.2cto.com/Article/201302/191261.html 1.由来:建立在 TRS的WCM6可直接获取管理员密码 漏洞的基础上   2.首先访问wcm目录, ...

  8. ffmpeg, libav学习记录

    转载自:http://hi.baidu.com/y11022053/item/81f12035182257332e0f8196 一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技 ...

  9. HDU 4722 Good Numbers

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 Good Numbers Time Limit: 2000/1000 MS (Java/Othe ...

  10. /usr/bin/ld: cannot find *** 的处理

    /usr/bin/ld: cannot find *** 的处理