简单来说,ASP.net乱码问题,一般仅存在于万恶的IE6下,IE7,IE8,Firefox,Chrome均没有此问题,所以,如果你的用户群都使用的是非IE6及非IE内核的浏览器,你可以return;了。
自从知道UTF-8编码后,为了与世界接轨,我就直接把自己的Blog改成UTF-8了,而且一直坚持推荐别人用UTF-8。但当使用了 ASP.net 后,我的思想动摇了,我想推荐国人还是使用自己的GB2312吧。因为你要在ASP.net里使用UTF-8并且你的ASP.net网站的客户群大都使用 IE6,那你的麻烦就大了,至少你在编码方面要考虑的问题就多了。
如果您要放弃国际接轨,放弃UTF-8,只想少点麻烦,那么只要这么做就OK了:
web.config里加:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
如果您肯定、一定、以及肯定,必须、必然、以及很有必要与世界接轨,打死也要使用UTF-8,那么,起头下边的艰难旅程吧: 1、设置web.config文件并改网页meta编码
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
2、传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
Response.Redirect("B.aspx?Name="+Server.UrlEncode( "中文参数")) ;
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
上面之所以用Server.UrlEncode是因为接收时Request就是解码后的,不是非要用Server.UrlDecode
如果使用HttpUtility.UrlEncode,那么你接收时一般得用Server.UrlDecode,如果 web.config没设置编码或编码是UTF8也可以直接用Request,但这就感觉麻烦了。
3、如果是使用javascript跳转到另一页,得使用escape将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
<script language="JavaScript">
function GoUrl()
{
var Name = "中文参数";
location.href = "B.aspx?Name="+escape(Name) ;
}
<body οnclick="GoUrl()">
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
总结:
一般来说。设置web.config文件并改网页meta编码,就可以了,其它情况得先进行编码。 ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。
下面我们来看两个参数:"test.aspx?string=??????"和 "test.aspx?string=风の世?%9 5? "。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风世界!为何同 一个参数会得到两个不一样的字符串呢?seo外链工具这是因为第一个参数是用GB2312的URL编码的,而第二个那个则是用UTF-8编码的。如果我们在 test.aspx中直接用Request.QueryString["string"]还取值,会发现第一个参数不能正常取值,而第二个参数则正常。这 是因为ASP.NET中在不指定编码的时候,默认是使用UTF-8的编码,自然进行URL反编码的时候用的也是UTF-8编码了。那么,GB2312的 URL编码的内容,用UTF-8的URL反编码,那肯定是会不正常的。
对付这问题,解决方法如下(web.config没有设置编码或编码设置为UTF-8时适用):
1、提交的参数是经过UTF-8 URL编码的,可以不作任何处理即可取到正常的值。
例如我提交的是"test.aspx?string=风の世?%9 5? ",那么获取的方法如下:
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
2、提交的参数是经过GB2312 URL编码的,,就不能直接取值了。
可以用下面的方法:
'引用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。代码如下:
string strBefore = "风世界";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
前提条件是web.config里没有设置编码为非utf-8
4、提交GB2312 URL编码参数。
因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:
//引用System.Text命名空间
string strBefore = "风世界";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
这样,URL编码后得到的就是GB2312的编码字符了。
另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312编码进行URL编码的。 1、HttpUtility.UrlEncode,HttpUtility.UrlDecode是静态方法,而Server.UrlEncode,Server.UrlDecode是实例方法。
2、Server是HttpServerUtility类的实例,是System.Web.UI.Page的属性。
3、用HttpUtility.UrlEncode编码后的字符串和用Server.UrlEncode进行编码后的字符串可能不一样:
例如:
string url="http://search.99read.com/index.aspx?book_sear ch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url));
输出结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=奥迷? ?
http://search.99read.com/index.aspx?book _search=all&main_str=?????
原因:Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的(如web.config里写的编码),而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。
如果改一下程序:
string url1="http://search.99read.com/index.aspx?book_sea rch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url1,System.T ext.Encoding.GetEncoding("GB2312")));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url1));
输出的结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=?????
http://search.99read.com/index.aspx?book _search=all&main_str=????? Request.UrlReferrer在大多数情况下均不能正常工作,所以,推荐使用其它方法代替,
如A.aspx页里点btuGO时:
protected void btnGO_Click(object sender, EventArgs e)
{
Session["UrlReferrer"] = Request.Url.OriginalString;
Response.Redirect("B.aspx?id=1", true);
}
在B.aspx页:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.UrlReferrer != null)
{
ViewState["UrlReferrer"] = Request.UrlReferrer.OriginalString;
}
else
{
ViewState["UrlReferrer"] = Session["UrlReferrer"];
Session["UrlReferrer"] = null;
}
}
}
然后B.aspx处理完后:
protected void btnOK_Click(object sender, EventArgs e)
{
Response.Redirect(ViewState["UrlReferrer"].ToStrin g(), true);
}
现在来看一下什么时候Request.UrlReferrer有效,什么时候无效:
转自:http://classicasp.aspfaq.com/general/what-is-wrong -with-request-servervariables-http-referer.html
What is wrong with Request.ServerVariables("HTTP_REFERER")? clicking on a Favorite, History, or the recently-typed URLs list;
clicking on 'Home' in IE's toolbar, or an item in IE's 'Links' toolbar;
using location.href or location.replace() in client-side JScript/JavaScript/VBScript;
using HierMenus (details);
typing the URL directly in the browser and hitting Enter or clicking 'Go';
launching a clickable URL from an e-mail or MS Office document;
using Response.Redirect / Server.Transfer;
using Response.AddHeader (302) or <meta http-equiv=refresh> to redirect;
loading the URL with XML (see Article #2173);
misspelling the variable name (many people assume HTTP_REFERRER).
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
' interchanged with the <meta> version:
%>
<meta
http-equiv='refresh'
content='10;URL=ref.asp'>
<form method=GET action=ref.asp name=getform>
<input type=submit value=' Go there (GET) >> '>
<input type=image style='cursor:hand'>
</form><p>
<form method=POST action=ref.asp name=postform>
<input type=submit value=' Go there (POST) >> '>
<input type=image style='cursor:hand'>
</form><p>
<a
href='ref.asp'>Go
there - straight link</a><p>
<a
href='#'
οnclick='window.location.href="ref.asp";return false;'>Go
there - javascript href</a><p>
<a
href='#'
οnclick='window.location.replace("ref.asp");return false;'>Go
there - javascript replace</a><p>
<a
href='#'
οnclick='document.getform.submit();return false;'>Go
there - javascript GET</a><p>
<a
href='#'
οnclick='document.postform.submit();return false;'>Go
there - javascript POST</a>
<script type="text/javascript">
//不管当前页面是什么编码,只要使用escape后传到哪都正常
function Encode(url) {
if (url.indexOf("?") == -1) {
newurl = url;
}
else {
newurl = url.substring(0, url.indexOf("?") + 1);
arrurl = url.substring(url.indexOf("?") + 1).split("&");
for (var i = 0; i < arrurl.length; i++) {
newurl += arrurl[i].split("=")[0] + "=" + escape(arrurl[i].split("=")[1]) + "&";
}
newurl = newurl.substring(0, newurl.length - 1);
return newurl;
}
}
</script>
public static string GetUTF8URL(string url)
{
int idx = url.IndexOf('?');
if (idx >= 0 && idx + 1 != url.Length)
{
NameValueCollection dict = HttpUtility.ParseQueryString(url.Substring(idx + 1));
StringBuilder sb = new StringBuilder();
foreach (string item in dict.AllKeys)
{
sb.AppendFormat("&{0}={1}", item, HttpUtility.UrlEncode(dict[item]));
}
url = url.Substring(0, idx + 1) + sb.ToString().Substring(1);
return url;
}
else
{
return url;
}
}
本文来源:http://www.yongfa365.com/Item/ASP.net-IE6-Luan-Ma. html
原本想写一个关于乱码产生原因及处理的方法的大篇文章介绍,但经过长达2天的研究,我发现,要想写一个全面的介绍,工程实在是太庞大,要取证各种情况下问题,太难了。
所以写一个简单的吧。
简单来说,ASP.net乱码问题,一般仅存在于万恶的IE6下,IE7,IE8,Firefox,Chrome均没有此问题,所以,如果你的用户群都使用的是非IE6及非IE内核的浏览器,你可以return;了。
自从知道UTF-8编码后,为了与世界接轨,我就直接把自己的Blog改成UTF-8了,并且一直坚持推荐别人用UTF-8。但当使用了 ASP.net 后,我的思想动摇了,我想推荐国人还是使用自己的GB2312吧。因为你要在ASP.net里使用UTF-8并且你的ASP.net网站的客户群大都使用 IE6,那你的麻烦就大了,至少你在编码方面要考虑的问题就多了。
如果您要放弃国际接轨,放弃UTF-8,只想少点麻烦,那么只要这么做就OK了:
web.config里加:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
如果您肯定、一定、以及肯定,必须、必然、以及很有必要与世界接轨,打死也要使用UTF-8,那么,开始下边的艰难旅程吧: 1、设置web.config文件并改网页meta编码
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
2、传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
Response.Redirect("B.aspx?Name="+Server.UrlEncode( "中文参数")) ;
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
上面之所以用Server.UrlEncode是因为接收时Request就是解码后的,不是非要用Server.UrlDecode
如果使用HttpUtility.UrlEncode,那么你接收时一般得用Server.UrlDecode,如果 web.config没设置编码或编码是UTF8也可以直接用Request,但这就感觉麻烦了。
3、如果是使用javascript跳转到另一页,得使用escape将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
<script language="JavaScript">
function GoUrl()
{
var Name = "中文参数";
location.href = "B.aspx?Name="+escape(Name) ;
}
<body οnclick="GoUrl()">
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
总结:
一般来说。设置web.config文件并改网页meta编码,就可以了,其它情况得先进行编码。 ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。
下面我们来看两个参数:"test.aspx?string=??????"和 "test.aspx?string=风の世?%9 5? "。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风世界!为什么同 一个参数会得到两个不一样的字符串呢?这是因为第一个参数是用GB2312的URL编码的,而第二个那个则是用UTF-8编码的。如果我们在 test.aspx中直接用Request.QueryString["string"]还取值,会发现第一个参数不能正常取值,而第二个参数则正常。这 是因为ASP.NET中在不指定编码的时候,默认是使用UTF-8的编码,自然进行URL反编码的时候用的也是UTF-8编码了。那么,GB2312的 URL编码的内容,用UTF-8的URL反编码,那肯定是会不正常的。
对付这问题,解决方法如下(web.config没有设置编码或编码设置为UTF-8时适用):
1、提交的参数是经过UTF-8 URL编码的,可以不作任何处理即可取到正常的值。
例如我提交的是"test.aspx?string=风の世?%9 5? ",那么获取的方法如下:
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
2、提交的参数是经过GB2312 URL编码的,,就不能直接取值了。
可以用下面的方法:
'引用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。代码如下:
string strBefore = "风世界";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
前提条件是web.config里没有设置编码为非utf-8
4、提交GB2312 URL编码参数。
因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:
//引用System.Text命名空间
string strBefore = "风世界";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
这样,URL编码后得到的就是GB2312的编码字符了。
另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312编码进行URL编码的。 1、HttpUtility.UrlEncode,HttpUtility.UrlDecode是静态方法,而Server.UrlEncode,Server.UrlDecode是实例方法。
2、Server是HttpServerUtility类的实例,是System.Web.UI.Page的属性。
3、用HttpUtility.UrlEncode编码后的字符串和用Server.UrlEncode进行编码后的字符串可能不一样:
例如:
string url="http://search.99read.com/index.aspx?book_sear ch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url));
输出结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=奥迷? ?
http://search.99read.com/index.aspx?book _search=all&main_str=?????
原因:Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的(如web.config里写的编码),而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。
如果改一下程序:
string url1="http://search.99read.com/index.aspx?book_sea rch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url1,System.T ext.Encoding.GetEncoding("GB2312")));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url1));
输出的结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=?????
http://search.99read.com/index.aspx?book _search=all&main_str=????? Request.UrlReferrer在大多数情况下均不能正常工作,所以,推荐使用其它方法代替,
如A.aspx页里点btuGO时:
protected void btnGO_Click(object sender, EventArgs e)
{
Session["UrlReferrer"] = Request.Url.OriginalString;
Response.Redirect("B.aspx?id=1", true);
}
在B.aspx页:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.UrlReferrer != null)
{
ViewState["UrlReferrer"] = Request.UrlReferrer.OriginalString;
}
else
{
ViewState["UrlReferrer"] = Session["UrlReferrer"];
Session["UrlReferrer"] = null;
}
}
}
然后B.aspx处理完后:
protected void btnOK_Click(object sender, EventArgs e)
{
Response.Redirect(ViewState["UrlReferrer"].ToStrin g(), true);
}
现在来看一下什么时候Request.UrlReferrer有效,什么时候无效:
转自:http://classicasp.aspfaq.com/general/what-is-wrong -with-request-servervariables-http-referer.html
What is wrong with Request.ServerVariables("HTTP_REFERER")? clicking on a Favorite, History, or the recently-typed URLs list;
clicking on 'Home' in IE's toolbar, or an item in IE's 'Links' toolbar;
using location.href or location.replace() in client-side JScript/JavaScript/VBScript;
using HierMenus (details);
typing the URL directly in the browser and hitting Enter or clicking 'Go';
launching a clickable URL from an e-mail or MS Office document;
using Response.Redirect / Server.Transfer;
using Response.AddHeader (302) or <meta http-equiv=refresh> to redirect;
loading the URL with XML (see Article #2173);
misspelling the variable name (many people assume HTTP_REFERRER).
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
' interchanged with the <meta> version:
%>
<meta
http-equiv='refresh'
content='10;URL=ref.asp'>
<form method=GET action=ref.asp name=getform>
<input type=submit value=' Go there (GET) >> '>
<input type=image style='cursor:hand'>
</form><p>
<form method=POST action=ref.asp name=postform>
<input type=submit value=' Go there (POST) >> '>
<input type=image style='cursor:hand'>
</form><p>
<a
href='ref.asp'>Go
there - straight link</a><p>
<a
href='#'
οnclick='window.location.href="ref.asp";return false;'>Go
there - javascript href</a><p>
<a
href='#'
οnclick='window.location.replace("ref.asp");return false;'>Go
there - javascript replace</a><p>
<a
href='#'
οnclick='document.getform.submit();return false;'>Go
there - javascript GET</a><p>
<a
href='#'
οnclick='document.postform.submit();return false;'>Go
there - javascript POST</a>
<script type="text/javascript">
//不管当前页面是什么编码,只要使用escape后传到哪都正常
function Encode(url) {
if (url.indexOf("?") == -1) {
newurl = url;
}
else {
newurl = url.substring(0, url.indexOf("?") + 1);
arrurl = url.substring(url.indexOf("?") + 1).split("&");
for (var i = 0; i < arrurl.length; i++) {
newurl += arrurl[i].split("=")[0] + "=" + escape(arrurl[i].split("=")[1]) + "&";
}
newurl = newurl.substring(0, newurl.length - 1);
return newurl;
}
}
</script>
public static string GetUTF8URL(string url)
{
int idx = url.IndexOf('?');
if (idx >= 0 && idx + 1 != url.Length)
{
NameValueCollection dict = HttpUtility.ParseQueryString(url.Substring(idx + 1));
StringBuilder sb = new StringBuilder();
foreach (string item in dict.AllKeys)
{
sb.AppendFormat("&{0}={1}", item, HttpUtility.UrlEncode(dict[item]));
}
url = url.Substring(0, idx + 1) + sb.ToString().Substring(1);
return url;
}
else
{
return url;
}
}
自从知道UTF-8编码后,为了与世界接轨,我就直接把自己的Blog改成UTF-8了,而且一直坚持推荐别人用UTF-8。但当使用了 ASP.net 后,我的思想动摇了,我想推荐国人还是使用自己的GB2312吧。因为你要在ASP.net里使用UTF-8并且你的ASP.net网站的客户群大都使用 IE6,那你的麻烦就大了,至少你在编码方面要考虑的问题就多了。
如果您要放弃国际接轨,放弃UTF-8,只想少点麻烦,那么只要这么做就OK了:
web.config里加:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
如果您肯定、一定、以及肯定,必须、必然、以及很有必要与世界接轨,打死也要使用UTF-8,那么,起头下边的艰难旅程吧: 1、设置web.config文件并改网页meta编码
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
2、传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
Response.Redirect("B.aspx?Name="+Server.UrlEncode( "中文参数")) ;
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
上面之所以用Server.UrlEncode是因为接收时Request就是解码后的,不是非要用Server.UrlDecode
如果使用HttpUtility.UrlEncode,那么你接收时一般得用Server.UrlDecode,如果 web.config没设置编码或编码是UTF8也可以直接用Request,但这就感觉麻烦了。
3、如果是使用javascript跳转到另一页,得使用escape将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
<script language="JavaScript">
function GoUrl()
{
var Name = "中文参数";
location.href = "B.aspx?Name="+escape(Name) ;
}
<body οnclick="GoUrl()">
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
总结:
一般来说。设置web.config文件并改网页meta编码,就可以了,其它情况得先进行编码。 ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。
下面我们来看两个参数:"test.aspx?string=??????"和 "test.aspx?string=风の世?%9 5? "。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风世界!为何同 一个参数会得到两个不一样的字符串呢?seo外链工具这是因为第一个参数是用GB2312的URL编码的,而第二个那个则是用UTF-8编码的。如果我们在 test.aspx中直接用Request.QueryString["string"]还取值,会发现第一个参数不能正常取值,而第二个参数则正常。这 是因为ASP.NET中在不指定编码的时候,默认是使用UTF-8的编码,自然进行URL反编码的时候用的也是UTF-8编码了。那么,GB2312的 URL编码的内容,用UTF-8的URL反编码,那肯定是会不正常的。
对付这问题,解决方法如下(web.config没有设置编码或编码设置为UTF-8时适用):
1、提交的参数是经过UTF-8 URL编码的,可以不作任何处理即可取到正常的值。
例如我提交的是"test.aspx?string=风の世?%9 5? ",那么获取的方法如下:
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
2、提交的参数是经过GB2312 URL编码的,,就不能直接取值了。
可以用下面的方法:
'引用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。代码如下:
string strBefore = "风世界";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
前提条件是web.config里没有设置编码为非utf-8
4、提交GB2312 URL编码参数。
因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:
//引用System.Text命名空间
string strBefore = "风世界";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
这样,URL编码后得到的就是GB2312的编码字符了。
另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312编码进行URL编码的。 1、HttpUtility.UrlEncode,HttpUtility.UrlDecode是静态方法,而Server.UrlEncode,Server.UrlDecode是实例方法。
2、Server是HttpServerUtility类的实例,是System.Web.UI.Page的属性。
3、用HttpUtility.UrlEncode编码后的字符串和用Server.UrlEncode进行编码后的字符串可能不一样:
例如:
string url="http://search.99read.com/index.aspx?book_sear ch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url));
输出结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=奥迷? ?
http://search.99read.com/index.aspx?book _search=all&main_str=?????
原因:Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的(如web.config里写的编码),而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。
如果改一下程序:
string url1="http://search.99read.com/index.aspx?book_sea rch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url1,System.T ext.Encoding.GetEncoding("GB2312")));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url1));
输出的结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=?????
http://search.99read.com/index.aspx?book _search=all&main_str=????? Request.UrlReferrer在大多数情况下均不能正常工作,所以,推荐使用其它方法代替,
如A.aspx页里点btuGO时:
protected void btnGO_Click(object sender, EventArgs e)
{
Session["UrlReferrer"] = Request.Url.OriginalString;
Response.Redirect("B.aspx?id=1", true);
}
在B.aspx页:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.UrlReferrer != null)
{
ViewState["UrlReferrer"] = Request.UrlReferrer.OriginalString;
}
else
{
ViewState["UrlReferrer"] = Session["UrlReferrer"];
Session["UrlReferrer"] = null;
}
}
}
然后B.aspx处理完后:
protected void btnOK_Click(object sender, EventArgs e)
{
Response.Redirect(ViewState["UrlReferrer"].ToStrin g(), true);
}
现在来看一下什么时候Request.UrlReferrer有效,什么时候无效:
转自:http://classicasp.aspfaq.com/general/what-is-wrong -with-request-servervariables-http-referer.html
What is wrong with Request.ServerVariables("HTTP_REFERER")? clicking on a Favorite, History, or the recently-typed URLs list;
clicking on 'Home' in IE's toolbar, or an item in IE's 'Links' toolbar;
using location.href or location.replace() in client-side JScript/JavaScript/VBScript;
using HierMenus (details);
typing the URL directly in the browser and hitting Enter or clicking 'Go';
launching a clickable URL from an e-mail or MS Office document;
using Response.Redirect / Server.Transfer;
using Response.AddHeader (302) or <meta http-equiv=refresh> to redirect;
loading the URL with XML (see Article #2173);
misspelling the variable name (many people assume HTTP_REFERRER).
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
' interchanged with the <meta> version:
%>
<meta
http-equiv='refresh'
content='10;URL=ref.asp'>
<form method=GET action=ref.asp name=getform>
<input type=submit value=' Go there (GET) >> '>
<input type=image style='cursor:hand'>
</form><p>
<form method=POST action=ref.asp name=postform>
<input type=submit value=' Go there (POST) >> '>
<input type=image style='cursor:hand'>
</form><p>
<a
href='ref.asp'>Go
there - straight link</a><p>
<a
href='#'
οnclick='window.location.href="ref.asp";return false;'>Go
there - javascript href</a><p>
<a
href='#'
οnclick='window.location.replace("ref.asp");return false;'>Go
there - javascript replace</a><p>
<a
href='#'
οnclick='document.getform.submit();return false;'>Go
there - javascript GET</a><p>
<a
href='#'
οnclick='document.postform.submit();return false;'>Go
there - javascript POST</a>
<script type="text/javascript">
//不管当前页面是什么编码,只要使用escape后传到哪都正常
function Encode(url) {
if (url.indexOf("?") == -1) {
newurl = url;
}
else {
newurl = url.substring(0, url.indexOf("?") + 1);
arrurl = url.substring(url.indexOf("?") + 1).split("&");
for (var i = 0; i < arrurl.length; i++) {
newurl += arrurl[i].split("=")[0] + "=" + escape(arrurl[i].split("=")[1]) + "&";
}
newurl = newurl.substring(0, newurl.length - 1);
return newurl;
}
}
</script>
public static string GetUTF8URL(string url)
{
int idx = url.IndexOf('?');
if (idx >= 0 && idx + 1 != url.Length)
{
NameValueCollection dict = HttpUtility.ParseQueryString(url.Substring(idx + 1));
StringBuilder sb = new StringBuilder();
foreach (string item in dict.AllKeys)
{
sb.AppendFormat("&{0}={1}", item, HttpUtility.UrlEncode(dict[item]));
}
url = url.Substring(0, idx + 1) + sb.ToString().Substring(1);
return url;
}
else
{
return url;
}
}
本文来源:http://www.yongfa365.com/Item/ASP.net-IE6-Luan-Ma. html
原本想写一个关于乱码产生原因及处理的方法的大篇文章介绍,但经过长达2天的研究,我发现,要想写一个全面的介绍,工程实在是太庞大,要取证各种情况下问题,太难了。
所以写一个简单的吧。
简单来说,ASP.net乱码问题,一般仅存在于万恶的IE6下,IE7,IE8,Firefox,Chrome均没有此问题,所以,如果你的用户群都使用的是非IE6及非IE内核的浏览器,你可以return;了。
自从知道UTF-8编码后,为了与世界接轨,我就直接把自己的Blog改成UTF-8了,并且一直坚持推荐别人用UTF-8。但当使用了 ASP.net 后,我的思想动摇了,我想推荐国人还是使用自己的GB2312吧。因为你要在ASP.net里使用UTF-8并且你的ASP.net网站的客户群大都使用 IE6,那你的麻烦就大了,至少你在编码方面要考虑的问题就多了。
如果您要放弃国际接轨,放弃UTF-8,只想少点麻烦,那么只要这么做就OK了:
web.config里加:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
如果您肯定、一定、以及肯定,必须、必然、以及很有必要与世界接轨,打死也要使用UTF-8,那么,开始下边的艰难旅程吧: 1、设置web.config文件并改网页meta编码
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
</system.web>
并将所有.aspx文件头里编码写为:
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" />
以保持一至
2、传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
Response.Redirect("B.aspx?Name="+Server.UrlEncode( "中文参数")) ;
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
上面之所以用Server.UrlEncode是因为接收时Request就是解码后的,不是非要用Server.UrlDecode
如果使用HttpUtility.UrlEncode,那么你接收时一般得用Server.UrlDecode,如果 web.config没设置编码或编码是UTF8也可以直接用Request,但这就感觉麻烦了。
3、如果是使用javascript跳转到另一页,得使用escape将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
<script language="JavaScript">
function GoUrl()
{
var Name = "中文参数";
location.href = "B.aspx?Name="+escape(Name) ;
}
<body οnclick="GoUrl()">
>> 进行接收
Response.Write(Server.UrlDecode(Request["Name"])) ;
或直接用:Request["Name"]
总结:
一般来说。设置web.config文件并改网页meta编码,就可以了,其它情况得先进行编码。 ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。
下面我们来看两个参数:"test.aspx?string=??????"和 "test.aspx?string=风の世?%9 5? "。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风世界!为什么同 一个参数会得到两个不一样的字符串呢?这是因为第一个参数是用GB2312的URL编码的,而第二个那个则是用UTF-8编码的。如果我们在 test.aspx中直接用Request.QueryString["string"]还取值,会发现第一个参数不能正常取值,而第二个参数则正常。这 是因为ASP.NET中在不指定编码的时候,默认是使用UTF-8的编码,自然进行URL反编码的时候用的也是UTF-8编码了。那么,GB2312的 URL编码的内容,用UTF-8的URL反编码,那肯定是会不正常的。
对付这问题,解决方法如下(web.config没有设置编码或编码设置为UTF-8时适用):
1、提交的参数是经过UTF-8 URL编码的,可以不作任何处理即可取到正常的值。
例如我提交的是"test.aspx?string=风の世?%9 5? ",那么获取的方法如下:
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
2、提交的参数是经过GB2312 URL编码的,,就不能直接取值了。
可以用下面的方法:
'引用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。代码如下:
string strBefore = "风世界";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
前提条件是web.config里没有设置编码为非utf-8
4、提交GB2312 URL编码参数。
因为系统默认使用的是UTF-8编码,所以要用GB2312进行URL编码。得指定一个编码才行。代码如下:
//引用System.Text命名空间
string strBefore = "风世界";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
这样,URL编码后得到的就是GB2312的编码字符了。
另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312编码进行URL编码的。 1、HttpUtility.UrlEncode,HttpUtility.UrlDecode是静态方法,而Server.UrlEncode,Server.UrlDecode是实例方法。
2、Server是HttpServerUtility类的实例,是System.Web.UI.Page的属性。
3、用HttpUtility.UrlEncode编码后的字符串和用Server.UrlEncode进行编码后的字符串可能不一样:
例如:
string url="http://search.99read.com/index.aspx?book_sear ch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url));
输出结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=奥迷? ?
http://search.99read.com/index.aspx?book _search=all&main_str=?????
原因:Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的(如web.config里写的编码),而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。
如果改一下程序:
string url1="http://search.99read.com/index.aspx?book_sea rch=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url1,System.T ext.Encoding.GetEncoding("GB2312")));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url1));
输出的结果是:
http://search.99read.com/index.aspx?book _search=all&main_str=?????
http://search.99read.com/index.aspx?book _search=all&main_str=????? Request.UrlReferrer在大多数情况下均不能正常工作,所以,推荐使用其它方法代替,
如A.aspx页里点btuGO时:
protected void btnGO_Click(object sender, EventArgs e)
{
Session["UrlReferrer"] = Request.Url.OriginalString;
Response.Redirect("B.aspx?id=1", true);
}
在B.aspx页:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.UrlReferrer != null)
{
ViewState["UrlReferrer"] = Request.UrlReferrer.OriginalString;
}
else
{
ViewState["UrlReferrer"] = Session["UrlReferrer"];
Session["UrlReferrer"] = null;
}
}
}
然后B.aspx处理完后:
protected void btnOK_Click(object sender, EventArgs e)
{
Response.Redirect(ViewState["UrlReferrer"].ToStrin g(), true);
}
现在来看一下什么时候Request.UrlReferrer有效,什么时候无效:
转自:http://classicasp.aspfaq.com/general/what-is-wrong -with-request-servervariables-http-referer.html
What is wrong with Request.ServerVariables("HTTP_REFERER")? clicking on a Favorite, History, or the recently-typed URLs list;
clicking on 'Home' in IE's toolbar, or an item in IE's 'Links' toolbar;
using location.href or location.replace() in client-side JScript/JavaScript/VBScript;
using HierMenus (details);
typing the URL directly in the browser and hitting Enter or clicking 'Go';
launching a clickable URL from an e-mail or MS Office document;
using Response.Redirect / Server.Transfer;
using Response.AddHeader (302) or <meta http-equiv=refresh> to redirect;
loading the URL with XML (see Article #2173);
misspelling the variable name (many people assume HTTP_REFERRER).
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
' interchanged with the <meta> version:
%>
<meta
http-equiv='refresh'
content='10;URL=ref.asp'>
<form method=GET action=ref.asp name=getform>
<input type=submit value=' Go there (GET) >> '>
<input type=image style='cursor:hand'>
</form><p>
<form method=POST action=ref.asp name=postform>
<input type=submit value=' Go there (POST) >> '>
<input type=image style='cursor:hand'>
</form><p>
<a
href='ref.asp'>Go
there - straight link</a><p>
<a
href='#'
οnclick='window.location.href="ref.asp";return false;'>Go
there - javascript href</a><p>
<a
href='#'
οnclick='window.location.replace("ref.asp");return false;'>Go
there - javascript replace</a><p>
<a
href='#'
οnclick='document.getform.submit();return false;'>Go
there - javascript GET</a><p>
<a
href='#'
οnclick='document.postform.submit();return false;'>Go
there - javascript POST</a>
<script type="text/javascript">
//不管当前页面是什么编码,只要使用escape后传到哪都正常
function Encode(url) {
if (url.indexOf("?") == -1) {
newurl = url;
}
else {
newurl = url.substring(0, url.indexOf("?") + 1);
arrurl = url.substring(url.indexOf("?") + 1).split("&");
for (var i = 0; i < arrurl.length; i++) {
newurl += arrurl[i].split("=")[0] + "=" + escape(arrurl[i].split("=")[1]) + "&";
}
newurl = newurl.substring(0, newurl.length - 1);
return newurl;
}
}
</script>
public static string GetUTF8URL(string url)
{
int idx = url.IndexOf('?');
if (idx >= 0 && idx + 1 != url.Length)
{
NameValueCollection dict = HttpUtility.ParseQueryString(url.Substring(idx + 1));
StringBuilder sb = new StringBuilder();
foreach (string item in dict.AllKeys)
{
sb.AppendFormat("&{0}={1}", item, HttpUtility.UrlEncode(dict[item]));
}
url = url.Substring(0, idx + 1) + sb.ToString().Substring(1);
return url;
}
else
{
return url;
}
}