
在用 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 也是這樣.

<html>

<head>

<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>

<title>URL解碼(Decode)/編碼(Encode)</title>

</head>

<body>

<center><font color=green size=+2>URL解碼(Decode)/編碼(Encode)</font><br>

需要解碼的字符串:<TEXTAREA ID="String1" ROWS="10" COLS="30"></TEXTAREA> 解碼后的字符串:<TEXTAREA ID="String2" ROWS="10" COLS="30"></TEXTAREA><br>

需要編碼的字符串:<TEXTAREA ID="String3" ROWS="10" COLS="30"></TEXTAREA> 編碼后的字符串:<TEXTAREA ID="String4" ROWS="10" COLS="30"></TEXTAREA><br>

<INPUT TYPE="button" ID="Decode" value="解碼(Decode)" onClick="javascript:String2.value=decodeURI(String1.value);">

<INPUT TYPE="button" ID="Encode" value="編碼(Encode)" onClick="javascript:String4.value=encodeURI(String3.value);">

</center>

</body>

</html>