關於URL中帶空格的問題
阿新 • • 發佈:2019-01-26
前些時間做了個檔案下載的應用,由於中文名檔案的原因,所以在拼URL的時候,會提前把檔名轉義
fileName = URLEncoder.encode(fileName,"UTF-8");
問題來了,如果檔名中帶空格的話,出問題了,空格被轉成了+,而不是%20,再向下載伺服器進行下載請求時,Servlet不認,直接出錯。
於是再考慮了一下,把程式碼中的空格轉成%20。
程式碼如下:
fileName = URLEncoder.encode(fileName,"UTF-8");
fileName = fileName.replaceAll("\\+","%20");
如上,問題解決了,再decode也可以正常得到正確的檔名。
為什麼會這樣呢,網上搜了一把,原理如下:
一個URL的基本組成部分包括協議(scheme),域名,埠號,路徑和查詢字串(路徑引數和錨點標記就暫不考慮了)。路徑和查詢字串之間用問號?分離。例如www.example.com/index?param=1,路徑為index,查詢字串(Query String)為param=1。URL中關於空格的編碼正是與空格所在位置相關:空格被編碼成加號+的情況只會在查詢字串部分出現,而被編碼成%20則可以出現在路徑和查詢字串中。
造成這種混亂局面的原因在於:W3C標準規定,當Content-Type為application/x-www-form-urlencoded時,URL中查詢引數名和引數值中空格要用加號+替代,所以幾乎所有使用該規範的瀏覽器在表單提交後,URL查詢引數中空格都會被編成加號+。而在另一份規範(RFC 2396,定義URI)裡, URI裡的保留字元都需轉義成%HH格式(Section 3.4 Query Component),因此空格會被編碼成%20,加號+本身也作為保留字而被編成%2B,對於某些遵循RFC 2396標準的應用來說,它可能不接受查詢字串中出現加號+,認為它是非法字元。所以一個安全的舉措是URL中統一使用%20來編碼空格字元。
具體的做法上面也給出了。