在用 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 也是這樣.
HttpUtility.UrlEncode 在 Encode 的時候, 將空格轉換成加號('+'), 在 Decode 的時候將加號轉為空格, 但是瀏覽器是不能理解加號為空格的, 所以如果文件名包含了空格, 在瀏覽器下載得到的文件, 空格就變成了加號
<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> 新聞熱點
疑難解答