数据库

asp.net中的url编码解码(转) .

2013-06-18

在对url进行编码时,该用哪一个?这两都使用上有什么区别吗?
测试:

string file="文件上(传)篇.doc";
string server_urlencode=server.urlencode(file);
string server_urldecode=server.urldecode(server_urlencode);
string httputility_urlencode=system.web.httputility.urlencode(file);
string httputility_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:%ce%c4%bc%fe%c9%cf%a3%a8%b4%ab%a3%a9%c6%aa.doc
server.urldecode:文件上(传)篇.doc
httputility.urlencode:%e6%96%87%e4%bb%b6%e4%b8%8a%ef%bc%88%e4%bc%a0%ef%bc%89%e7%af%87.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 之后, 将 "+" 替换成 "%20"( 如果原来是 "+" 则被转换成 "%2b" ) , 如:

filename = httputility.urlencode(filename, encoding.utf8);
filename = filename.replace("+", "%20");

不明白微软为什么要把空格转换成加号而不是"%20". 记得 jdk 的 urlencoder 是将空格转换成 "%20"的.
经检查, 在 .net 2.0 也是这样.

上面是从别的地方拷贝的,写得很好,我自己的一个程序中也遇到同样的问题,默认aspx是以utf-8为编码的,在我这个程序中必须用gb2312为默认编码
(<globalization requestencoding="gb2312" responseencoding="gb2312"/>),

问 题出现了,以前没有问题的httputility.urldecode在page.request回的值是乱码这就是上面说的 httputility.urldecode默认以utf8对url进行编码,这种情况下面只需将httputility.urldecode改成 server.urlencode即可。