当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 巧用escape解决ASP.NET中URL传参乱码问题

ASP.NET
C# Quoted-Printable编码、解码
asp.net Google的translate工具翻译 API
.NET读取所有目录下文件正则匹配文本电子邮件
asp.net 半角全角转化工具
AjaxControlToolKit 显示浏览者本地语言的方法
asp.net HTML文件上传标签
ASP.NET 绑定DataSet中的多个表
ASP.NET 重定向的几种方法小结
Asp.Net 重定向必须要知道的一些资料
ASP.NET 导出到Excel时保留换行的代码
Asp.Net Cache缓存使用代码
document.getElementsByName和document.getElementById 在IE与FF中不同实现
GridView单元格合并
asp.net 大文件上传控件
asp.net 日期函数 某月的第一天和最后一天的日期
asp.net 时间类 一周的周一和周末的日期
C# javaScript函数的相互调用
asp.net membership 密码重设
"虚拟路径"..."映射到另一个应用程序,这是不允许的!
如何传值在2个页面之间 要求不刷新父页面,并且不能用Querystring传值

巧用escape解决ASP.NET中URL传参乱码问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 266 ::
收藏到网摘: n/a

程序代码
<a href="#" onclick="window.open('http://www.ruanchen.com/');">Links</a>

在test.aspx中,只要获取title参数的值并显示出来即可,本来用Request["title"]就可解决的问题却因链接所处页面的编码不同而变得复杂起来:

当链接所处的页面是用GB2312编码时,如果test.aspx也是GB2312则获取的参数值不乱码,否则乱码;
当链接所处的页面是用UTF-8编码时,如果test.aspx也是UTF-8则获取的参数值不乱码,否则乱码;

gb.htm:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>gb2312测试页</title>
</head>

<body>
<a href="#" onclick="window.open('http://www.ruanchen.com/');">Links</a>
</body>
</html>

utf8.htm:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>utf-8测试页</title>
</head>

<body>
<a href="#" onclick="window.open('http://www.ruanchen.com/');">Links</a>
</body>
</html>

test.aspx.cs:
private void Page_Load(object sender, System.EventArgs e)
{
    String Request1;
    Request1 = Request["title"];
    Response.Write(Request1);
}

有没办法让test.aspx不论URL中的参数以何种方式编码都能正常的获取显示呢?通过配置web.config的<globalization requestEncoding="gb2312|utf-8" />都只会顾此失彼,不能完美的解决我们的问题。最终,在老农的提示下使用JS的escape问题得以完美解决:
gb.htm:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>gb2312测试页</title>
<script language="javascript">
function winopen(url,width,height)
{
    var newurl,arrurl;
    if(typeof(url) == "undefined" || url == "")
    {
        return ;
    }
    else
    {
        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);
        }
    }
    if(typeof(width) != "number" || typeof(height) != "number")
    {
        window.open(newurl);
    }
    else
    {
        window.open(newurl,"","width=" + width + ",height=" + height);
    }
}
</script>
</head>

<body>
<a href="#" onclick="winopen('http://www.ruanchen.com/');">Links</a>
</body>
</html>

utf8.htm:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>utf-8测试页</title>
<script language="javascript">
function winopen(url,width,height)
{
    var newurl,arrurl;
    if(typeof(url) == "undefined" || url == "")
    {
        return ;
    }
    else
    {
        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);
        }
    }
    if(typeof(width) != "number" || typeof(height) != "number")
    {
        window.open(newurl);
    }
    else
    {
        window.open(newurl,"","width=" + width + ",height=" + height);
    }
}
</script>
</head>

<body>
<a href="#" onclick="winopen('http://www.ruanchen.com/',300,400);">Links</a>
</body>
</html>

现在完全不用考虑链接所在页面的编码方式,也不用绞尽脑汁去想如何在test.aspx对不同编码的参数值进行转换,只需用一个escape就够了,very good!