ASP.net在IE6下乱码问题解决方法

原本想写一个关于乱码产生原因及处理的方法的大篇文章介绍,但经过长达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,那么,开始下边的艰难旅程吧:

ASP.net在IE6下乱码问题 有三种解决方法:


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如何接收及发送不同的编码

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反编码,那肯定是会不正常的。

对于这问题,解决方法如下(web.config没有设置编码或编码设置为UTF-8时适用):

1、提交的参数是经过UTF-8 URL编码的,可以不作任何处理即可取到正常的值。

例如我提交的是“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”,那么获取的方法如下:

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编码的。


HttpUtility.UrlEncode   HttpUtility.UrlDecode Server.UrlEncode Server.UrlDecode需要注意的几点:

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_search=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url));
输出结果是:
http%3a%2f%2fsearch.99read.com%2findex.aspx%3fbook_search%3dall%26main_str%3d%e5%a5%a5%e8%bf%b7%e5%b0%94
http%3a%2f%2fsearch.99read.com%2findex.aspx%3fbook_search%3dall%26main_str%3d%b0%c2%c3%d4%b6%fb

原因:Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的(如web.config里写的编码),而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。

如果改一下程序:
string url1="http://search.99read.com/index.aspx?book_search=all&main_str=奥迷尔";
Response.Write(HttpUtility.UrlEncode(url1,System.Text.Encoding.GetEncoding("GB2312")));
Response.Write("<br>");
Response.Write(Server.UrlEncode(url1));
输出的结果是:
http%3a%2f%2fsearch.99read.com%2findex.aspx%3fbook_search%3dall%26main_str%3d%b0%c2%c3%d4%b6%fb
http%3a%2f%2fsearch.99read.com%2findex.aspx%3fbook_search%3dall%26main_str%3d%b0%c2%c3%d4%b6%fb


关于Request.UrlReferrer问题

 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"].ToString(), true);
    }


现在来看一下什么时候Request.UrlReferrer有效,什么时候无效:
转自:http://classicasp.aspfaq.com/general/what-is-wrong-with-request-servervariables-http-referer.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值