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


Posted on May 23, 2008


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

以往的经验告诉我,还是用UTF-8编码比较省事,基本没有什么麻烦!


标签:.NETasp.net

其它推荐日志:

System.NullReferenceException: 未将对象引用设置到对象的实例。

IE8引发VS2005/2008向导出错的解决方案

纯真IP数据库格式详解

scroll lock

修理Vista:删除新建“快捷方式”

数组名和数组名取地址的区别

完美解决IE兼容模式问题

使用命令行启动VirtualBox虚拟机

Vista技巧:禁用Vista中的移动中心

ASP.NET图片防盗链的方法

可恶的EditPlus!?

搜集几个免费ASP空间,不能保证其时效性,仅供参考实践用!

ACCESS不能用的问题!

Mysql中文乱码

VS2005出现visual sourcesafe login窗口

javascript 判断是否为数字

asp.net过程中引用js文件出错的解决办法

Google sitemap制作

PDF To Image Converter(PDF文件转图片格式)

一行代码杜绝iframe挂马

关于"Could not load file or assembly ''Microsoft.Office.Interop.Word''..."问题的解决方法

Excel2003生成Excel.dll的方法

EXISTS与IN的区别

.NET开发中的一些小技巧

C#中时间格式的转换

Excel中利用VBA实现批量设置文本的上标

介绍一个web2.0站点模板

软件项目版本号的命名格式

关于lvalue required as left operand of assignment

定义CLASS和方法的默认缺省修饰符!

什么是脚本语言

asp判断session是否超时!

镜面屏VS非镜面屏

IE7启动时总打开runonce2.aspx的解决办法

Mime类型列表

c#中结构数组定义

Visual Web Developer 2005 速成版 生成DLL的问题

嵌入式系统VxWorks介绍及编程

如何判断Request.QueryString["type"]是否存在

LPCTSTR是什么意思?-_-!


Search
最新评论
推荐日志
微信扫一扫