转自 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%%ae%e4%b8%%e7%%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反编码,那肯定是会不正常的。

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

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

  这种情况下,可以不作任何处理即可取到正常的值。例如我提交的是“test.aspx?string=%e9%a3%8e%e3%%ae%e4%b8%%e7%%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);   、提交的参数是经过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编码字符串,可以接着往下看。   、提交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);   、提交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" />

最新文章

  1. PopupWindow+ListView+OnItemClick点击无效
  2. linux上课
  3. 操蛋的CTex
  4. 整理: Android HAL
  5. 如何在Ubuntu上更新Node.js
  6. ORA-00119: invalid specification for system parameter LOCAL_LISTENER - 转
  7. 关于使用UDP(TCP)跨局域网,NAT穿透的心得
  8. Oracel JDBC URL 和 Driver 的获取
  9. linux下查看所有用户及所有用户组
  10. iOS9适配+warning消除
  11. hdu 1536 S-Nim (简单sg函数)
  12. request.getparam()与request.getAttibute()的区别
  13. 【转】CGI
  14. C# 中的集合(Array/ArrayList/List&lt;T&gt;/HashTable/Dictionary)
  15. python文件读写小结
  16. Go Example--通道同步
  17. SVG 学习&lt;五&gt; SVG动画
  18. Flyweight享元模式(结构型模式)
  19. mysql添加事件
  20. NPOI2.2.0.0实例详解(十一)—向EXCEL插入图片

热门文章

  1. 6.查找单链表中的倒数第k个结点
  2. Jenkins的安装配置[转]
  3. linux 上安裝lnmp
  4. springboot - Constructor、@Autowired、@PostConstruct分析
  5. django 配置中STATICFILES_DIRS 和STATIC_ROOT不能同时出现
  6. Cakephp中使用JavaScriptHelper来引入js文件
  7. 协助CIO成功实施ITIL
  8. 复习js
  9. Java -- 获取MAC地址
  10. Go之Channel详解