http://hi.baidu.com/fangjun953322/item/041d9bf3adb76dc2a835a29e
Server.UrlEncode编码是使用系统默认的,而 System.Web.HttpUtility.UrlEncode却可以指定编码。如:System.Web.HttpUtility.UrlEncode("中文",Encoding.UTF8);
HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在 Decode的时候将加号转为空格
解决办法是, 在 HttpUtility 的 UrlEncode 之后, 将 "+" 替换成 " "( 如果原来是 "+" 则被转换成" " )
Server.URLEncode方法会在一个字符串上应用URL的编码规则, 包括转义字符.
URLEncode会如下转换字符:
举例:
<%Response.Write(Server.URLEncode("http://www.microsoft.com"))%>
输出结果为
http://www.microsoft.com
HttpUtility.UrlEncode方法可以被用来编码整个URL,包括查询字符串值(query-string values). 诸如空格和其他的标点符号传入HTTP stream的时候,他们可能会被误解析为流的结尾. URL encoding会把这些URL中不允许出现的字符转换为等同的字符实体. URLdecoding会执行逆操作.
你可以使用UrlEncode()方法或UrlPathEncode()方法. 然而, 这两个方法的返回值是不同的.
UrlEncode()方法会把空格转换为加号(+).
UrlPathEncode()方法会把空格转换为字符串" ",这也是空格的十六进制的表示方式.
你应该在对URL中的path部分编码时使用UrlPathEncode()方法, 这样能确保不论在什么平台或浏览器上执行解码的时候,都会得到一个合法的URL.
两个方法的区别
他们之间没有什么具体的区别. Server.UrlEncode的存在是因为需要与经典的ASP兼容.
HttpServerUtility.UrlEncode 会在内部调用HttpUtility.UrlEncode.
在对URL进行编码时,该用哪一个?这两都使用上有什么区别吗?
测试:
string file="文件上(传)篇.doc";
string Server_UrlEncode=Server.UrlEncode(file);
stringServer_UrlDecode=Server.UrlDecode(Server_UrlEncode);
stringHttpUtility_UrlEncode=System.Web.HttpUtility.UrlEncode(file);
stringHttpUtility_UrlDecode=System.Web.HttpUtility.UrlDecode(HttpUtility_UrlEncode);
Response.Write("原数据:"+file);
SFun.WriteLine("Server.UrlEncode:"+Server_UrlEncode);
SFun.WriteLine("Server.UrlDecode:"+Server_UrlDecode);
SFun.WriteLine("HttpUtility.UrlEncode:"+HttpUtility_UrlEncode);
SFun.WriteLine("HttpUtility.UrlDecode:"+HttpUtility_UrlDecode);
输出:
原数据:文件上(传)篇.doc
Server.UrlEncode:�ļ��ϣ�����ƪ.doc
Server.UrlDecode:文件上(传)篇.doc
HttpUtility.UrlEncode:文件上(传)篇.doc
HttpUtility.UrlDecode:文件上(传)篇.doc
区别在于:HttpUtility.UrlEncode()默认是以UTF8对URL进行编码,而Server.UrlEncode()则以默认的编码对URL进行编码。
在用 ASP.Net 开发页面的时候, 我们常常通过 System.Web.HttpUtility.UrlEncode 和UrlDecode 在页面间通过 URL 传递参数. 成对的使用 Encode 和 Decode是没有问题的.
但是, 我们在编写文件下载的页面的时候, 常常用如下方法来指定下载的文件的名称:
Response.AddHeader("Content-Disposition","attachment;filename="
+ HttpUtility.UrlEncode(fileName, Encoding.UTF8));
之所以转换成 UTF8 是为了支持中文文件名.
这 时候问题就来了, 因为 HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在Decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了空格, 在浏览器下载得到的文件,空格就变成了加号.
一个解决办法是, 在 HttpUtility 的 UrlEncode 之后, 将 "+" 替换成 " "( 如果原来是 "+"则被转换成 "+" ) , 如:
fileName = HttpUtility.UrlEncode(fileName,Encoding.UTF8);
fileName = fileName.Replace("+", "");
不明白微软为什么要把空格转换成加号而不是" ". 记得 JDK 的 UrlEncoder 是将空格转换成 ""的.
经检查, 在 .Net 2.0 也是这样.
默认aspx是以utf-8为编码的,程序中必须用gb2312为默认编码(<globalizationrequestEncoding="gb2312"responseEncoding="gb2312"/>),问题出现了,以前没有问题的HttpUtility.UrlDecode在Page.Request回的值是乱码这就是上面说的HttpUtility.UrlDecode默认以UTF8对URL进行编码,这种情况下面只需将HttpUtility.UrlDecode改成Server.UrlEncode即可。