Request.QueryString的⽤法(取不到值中⽂乱码)解决办法
天做新的ppc weather服务器的时候竟然碰到QueryString取不到值的问题
查了下⽹上,应该是编码的问题,tq121⽤的是utf-8,⽽我希望⽤gb2132输⼊~
因此,改⼀下~哈哈
打开fig把
<!-- <globalization
Encoding="utf-8"
responseEncoding="utf-8"
/>
改成 <globalization
requestEncoding="gb2312"
responseEncoding="gb2312"
/>
</system.web>
Request.QueryString中⽂乱码解决办法
下⾯我们来看两个参数:“test.x?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编码的。
问题是,如果我们是在JS⾥⾯设置QueryString的,那⼜怎样处理呢?答案是使⽤encodeURI()函数。url编码和utf8区别
⼜到了⼀篇⽂章:
中存在⼏种对URL字符串进⾏编码的⽅法:escape(),encodeURI(),以及encodeURIComponent()。这⼏种编码所起的作⽤各不相同。escape() ⽅法:
采⽤ISO Latin字符集对指定的字符串进⾏编码。所有的空格符、标点符号、特殊字符以及其他⾮ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表⾥⾯的编码的16进制数字)。⽐如,空格符对应的编码是%20。
不会被此⽅法编码的字符: @ * / +
encodeURI() ⽅法:
把URI字符串采⽤UTF-8编码格式转化成escape格式的字符串。
不会被此⽅法编码的字符:! @ # $& * ( ) = : / ; ? + ’
encodeURIComponent() ⽅法:
把URI字符串采⽤UTF-8编码格式转化成escape格式的字符串。与encodeURI()相⽐,这个⽅法将对更多的字符进⾏编码,⽐如 / 等字符。所以如果字符串⾥⾯包含了URI的⼏个部分的话,不能⽤这个⽅法来进⾏编码,否则 / 字符被编码之后URL将显⽰错误。
不会被此⽅法编码的字符:! * ( ) ’
因此,对于中⽂字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(⽐如原页⾯和⽬标页⾯的charset是⼀致的时候),只需要使⽤escape。如果你的页⾯是GB2312或者其他的编码,⽽接受参数的页⾯是UTF-8编码的,就要采⽤encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。