首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
不同服务器之间使用地址传递数据
所属栏目:ASP.NET(webform)  时间:2009-10-30 12:22  作者:狼子

在页面间传递数据,是不是同一台服务器不管,参数中可能出现中文,就要先进行编码,编码的时候,一般使用Server.URLEncode方法

就是,在不同服务器之间传递数据,Server.URLEncode方法的编码有时是不同的,应该使用HttpUtility.UrlDecode方法,这个方法默认是以utf-8编码的

两句话说完这个问题,下面找原因,我想要知道为什么,就是,我现在还不知道为什么。。。

Server.URLEncode 编码是怎么决定的:http://www.cftea.com/c/2009/07/SYB3RSQFF1KDBB0C.asp

其实 Server.URLEncode 编码并不是由网页的编码决定的,而是由其参数的编码决定的。

情况一

网页编码是 UTF-8,Server.URLEncode("静态文字"),此时输出“静态文字”的 UTF-8 编码 %E9%9D%99%E6%80%81%E6%96%87%E5%AD%97。因为网页是 UTF-8 的,“静态文字”这几个字就是 UTF-8 的,所以 Server.URLEncode 也是按 UTF-8 来编码的。

情况二

网页编码是 UTF-8,Server.URLEncode(rs("content")),内容是通过 RecordSet 从 SQL Server 数据库中的 content 字段读取的,虽然数据库中是使用 Unicode 编码来存的,但由于 IIS 去读的时候,会使用默认的转换,即 Unicode 到 ANSI(gb2312)。所以 rs("content") 是 ANSI(gb2312)的,所以 Server.URLEncode 是按 ANSI(gb2312)编码的,而不是按 UTF-8。

注意,上述情况也有例外:某些 Web 服务器、数据库管理系统从数据库中读出来仍是 UTF-8。

上面说的我觉得好像有问题,我在两个服务器上测试过,测试代码如下:

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("<br>我是好孩子:" + Server.UrlEncode("我是好孩子"));
        Response.Write("<br>我是好孩子:" + HttpUtility.UrlEncode("我是好孩子"));


        Response.Write("<br>以下测试转换编码:");

        string test = "我是好孩子";
        Response.Write("<br>当前编码:" + Encoding.Default.EncodingName);

        //用默认编码取每一个字节
        byte[] byteDefault = Encoding.Default.GetBytes(test);
        //把每一个字节转换成utf-8编码
        byte[] byteUtf8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, byteDefault);
        //用utf-8编码把每个字节存入字符串里
        string result = Encoding.GetEncoding(65001).GetString(byteUtf8);

        Response.Write("<br>result = " + result);
        Response.Write("<br>UrlEncode(result) = " + Server.UrlEncode(result));

        Response.End();
    }

其中

Response.Write("<br>当前编码:" + Encoding.Default.EncodingName);

输出的结果,两个服务器都显示

当前编码:简体中文(GB2312)

就是,上面的测试

Server.UrlEncode("我是好孩子");

输出的结果完全不同:

我是好孩子:%ce%d2%ca%c7%ba%c3%ba%a2%d7%d3
我是好孩子:%e6%88%91%e6%98%af%e5%a5%bd%e5%ad%a9%e5%ad%90

其中第二台机器使用了utf-8编码了,为什么默认编码都是gb2312,web.config里也设置了

<globalization requestEncoding="gb2312" responseEncoding="gb2312"/>

还会以utf-8编码呢?我这样子测试法,应该是属于情况一的啊,这里不明白。。。

有一个文章标题是《Server.UrlEncode、HttpUtility.UrlDecode的区别》,个个都说是原创,我不知道哪里是原创,百度到处都有。。。这个文章里讲了一句:

区别在于:HttpUtility.UrlEncode()默认是以UTF8对URL进行编码,而Server.UrlEncode()则以默认的编码对URL进行编码。

这个和我原来的理解相同,就是,不可以解释我上面遇到的问题

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17