在页面间传递数据,是不是同一台服务器不管,参数中可能出现中文,就要先进行编码,编码的时候,一般使用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进行编码。
这个和我原来的理解相同,就是,不可以解释我上面遇到的问题