zoukankan      html  css  js  c++  java
  • [转]ASP.NET中Request.QueryString的乱码问题

    今天在使用Request.QueryString的时候,发现所有接收到的字符串,只要是带中文的都会变成乱码。后来经过研究,终于找到了原因。

      ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。

      下面我们来看两个参数:“test.aspx?string=%b7%e7%a4%ce%ca%c0%bd%e7”和“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风の世界!为什么同一个参数会得到两个不一样的字符串呢?这是因为第一个参数是用GB2312的URL编码的,而第二个那个则是用UTF-8编码的。如果我们在test.aspx中直接用Request.QueryString["string"]还取值,会发现第一个参数不能正常取值,而第二个参数则正常。这是因为ASP.NET中在不指定编码的时候,默认是使用UTF-8的编码,自然进行URL反编码的时候用的也是UTF-8编码了。那么,GB2312的URL编码的内容,用UTF-8的URL反编码,那肯定是会不正常的。

      对于这问题,解决方法如下:

      1、提交的参数是经过UTF-8 URL编码的。

      这种情况下,可以不作任何处理即可取到正常的值。例如我提交的是“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”,那么获取的方法如下:


       'Visual Basic.NET

       Dim stringValue As String
       stringValue = Request.QueryString("string")
       Response.Write(stringValue)


       //Visual C#
       string stringValue;
       stringValue = Request.QueryString["string"];
       Response.Write(stringValue);


      2、提交的参数是经过GB2312 URL编码的。

      在这种情况下,就不能直接取值了。可以用下面的方法:


       'Visual Basic.NET

       '引用System.Collections.Specialized和System.Text命名空间
       Dim stringValue As String
       Dim gb2312Requests As NameValueCollection
       gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
       Response.Write(gb2312Requests("string"))  '里面的string就是你提交的参数的Key


       //Visual C#
       '引用System.Collections.Specialized和System.Text命名空间
       string stringValue;
       NameValueCollection gb2312Requests;
       gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
       Response.Write(gb2312Requests["string"]);  //'里面的string就是你提交的参数的Key


      有的时候,我们还想提交不同编码的URL编码字符串,可以接着往下看。

      3、提交UTF8 URL编码参数。

      前面已经说过,在不指定编码的时候,系统是自动使用UTF-8编码的,那么我们要提交UTF8 URL编码参数可以直接使用Server.UrlEncode。代码如下:


       'Visual Basic.NET

       Dim strBefore As String = "风の世界"
       Dim strAfter As String = ""
       strAfter = Server.UrlEncode(strBefore)
       Response.Write(strAlfter)


       //Visual C#
       string strBefore = "风の世界";
       string strAlfter = "";
       strAfter = Server.UrlEncode(strBefore);
       Response.Write(strAlfter);


      4、提交GB2312 URL编码参数。

      因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:


       'Visual Basic.NET

       '引用System.Text命名空间
       Dim strBefore As String = "风の世界"
       Dim strAfter As String = ""
       strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"))
       Response.Write(strAlfter)


       //Visual C#
       //引用System.Text命名空间
       string strBefore = "风の世界";
       string strAlfter = "";
       strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
       Response.Write(strAlfter);


      这样,URL编码后得到的就是GB2312的编码字符了。

      另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312编码进行URL编码的。

  • 相关阅读:
    "Automation 服务器不能创建对象" 的解决方法
    让DataGrid拥有单击回传事件并带回指定字段的值
    SQL 和TSQL学习(一)
    数据写入XML
    DATALIST分页存储过程
    The target assembly contains no service types. You may need to adjust the Code Access Security policy of this assembly." 目标程序集不包含服务类型。可能需要调整此程序集的代码访问
    字符串转日期
    C# 日期和时间正则表达式
    js根据输入日期显示该月的最后一天的日期[转]
    JavaScript试题【解析+答案】
  • 原文地址:https://www.cnblogs.com/wangpei/p/1337727.html
Copyright © 2011-2022 走看看