HttpUtility.UrlEncode将空格转换成加号引发的问题

在用 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 的时候将加号转为空格,但是浏览器是不能理解加号为空格的,所以如果文件名包含了空格, 在浏览器下载得到的文件,空格就变成了加号(dnawo注:还是能成功下载的,只是原本文件名中的空格下载到本地后成了加号)。

一个解决办法是,在 HttpUtility 的 UrlEncode 之后,将 + 替换成 %20( 如果原来是 + 则被转换成 %2b ),如:

fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
fileName = fileName.Replace("+", "%20");

不明白微软为什么要把空格转换成加号而不是 %20。记得 JDK 的 UrlEncoder 是将空格转换成 %20 的。

经检查,在 .Net 2.0 也是这样。

评论: 0 | 引用: 0 | 查看次数: 7041
发表评论
登录后再发表评论!