关于ASP.NET中Request.QueryString的乱码问题(转)

转自 http://www.cnblogs.com/chinhr/archive/2008/09/23/1296582.html

今天在使用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编码的。

在web.config修改如下
<globalization requestEncoding="gb2312" responseEncoding="gb2312" />
时间: 2024-10-10 06:28:17

关于ASP.NET中Request.QueryString的乱码问题(转)的相关文章

asp.net中Request.QueryString与Request.Param的区别分析

看起来Request.Params更好一些,但是既然Param包括了所有,为什么还要有QueryString呢?? request.params其实是一个集合,它依次包括request.querystring.request.form.request.cookies和request.servervariables. 如果要在两个页面传递数据的话,只能用request.querystring.request.form.request.cookies Request.Params 是在 QueryS

ASP.NET Request.QueryString 出现乱码问题

前台: var txing = $("#txing").combobox("getValues"); .......... &tixing=" + encodeURI(txing) 后台: string tixing = Server.UrlDecode(Request.QueryString["tixing"]);

Request.Querystring中文乱码问题解决

现象:近期项目中用到查询字符串传值,如果传递的是英文一切正常,但是传递中文时,使用request.querystring[]得到的是乱码. 原因:不知道为什么,可能是编码不一致问题 解决方法1:修改web.config文件添加<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312&q

在asp.net中解决cookies中文乱码问题

在设置cookie时,如果存入cookie中的内容为中文,则读取后变成乱码,英文或者数字不存在这种问题.解决办法是不直接存取,而是采用编码的方法进行存取. 1.设置cookie public void setCookies() { HttpCookie ck = new HttpCookie("ckLogin"); ck.Values.Add("cID", HttpUtility.UrlEncode(UserID)); ck.Values.Add("cPW

asp.net中Request请求参数的自动封装

这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> &

ASP.NET中Request.RawUrl、Request.Url的区别

如果访问的地址是: http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu 那么 Request.Url.ToString() 的值是:http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree<&n=myslider Request.RawUrl.ToString() 的值是:/guestbook/addmessa

Asp.net中Request.Url的各个属性对应的意义介绍

转:http://www.jb51.net/article/30254.htm 虚拟目录的路径: Request.ApplicationPath 站点的物理路径(完整路径): Request.PhysicalPath 站点物理路径的目录: System.IO.Path.GetDirectoryName(Request.PhysicalPath) 站点物理路径的目录: Request.PhysicalApplicationPath 当前页面的文件名: System.IO.Path.GetFileN

ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath

1.Request.ApplicationPath->当前应用的目录 2.Request.FilePath->对应于iis的虚拟目录   如 URL http://mockte.com/1/index.html/pathinfo   FilePath = /1/index.html 3.Request.Path->当前请求的虚拟路径   Path 是 FilePath 和 PathInfo 尾部的串联.例如 URL http://mockte.com/1/index.html/pathi

jsp中request.getParameter()中文乱码问题解决

关于使用request.getParameter()得到中文乱码的问题,在网上查找了一天终于找到了一个解决方案,是一个比较笨的方法,要在每个使用request.getParameter()的地方添加如下代码,代码如下: 1 String name=request.getParameter("name"); 2 if(name!=null){ 3 name=new String(name.getBytes("ISO8859_1"),"utf-8")