zoukankan      html  css  js  c++  java
  • asp.net在IE6下的解决方法

    简单来说,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;


      }


      }
  • 相关阅读:
    移动互联网全新体验Andoid
    《XNA高级编程:Xbox 360和Windows》51
    《XNA高级编程:Xbox 360和Windows》47
    让FCKeditor支持多用户环境(asp.net)
    《XNA高级编程:Xbox 360和Windows》45
    《XNA高级编程:Xbox 360和Windows》46
    《XNA高级编程:Xbox 360和Windows》44
    《XNA高级编程:Xbox 360和Windows》43
    hdu 4314 Save the dwarfs 夜
    poj 3150 Cellular Automaton 夜
  • 原文地址:https://www.cnblogs.com/neso520/p/12491262.html
Copyright © 2011-2022 走看看