URLEncoder轉換字符串問題

今天在開發過程中遇到了一個坑,關於使用URLEncoder去encode字符串的問題,是解析一個下載地址,由於下載文件名中含有空格,導致encode之後所有空格變成了“ + ”,url拼接自然就出錯了,下載地址相應不到報了404異常,由於之前沒接觸過這方面的事情,也算是給自己挖了一個小坑,特此記錄一下。

這段是業務背景,不想看的直接跳到下一段看解決辦法哈。大概是這樣,公司網站原本下載各種附件的地址都是自己的靜態服務器,但是以後要切換到騰訊雲了,不過原來的老業務裏文件地址不變,由於原本的下載地址基本都是通過hard code寫死前綴http://xxxx.xxx.xxx,後面再拼接上file url例如/docs/人員名單.xls,現在由於服務器的變化,前綴地址不再固定,所以在數據庫表中添加了prefix字段用於存放服務器的地址,新邏輯也就成了prefix + fileUrl,原本是一個比較簡單的需求,可以算是體力活,只要把原來所有涉及下載的接口或者頁面的對應位置都修改了就可以了。其中有一處頁面改完之後是點擊按鈕後直接返回拼接好的下載地址自動下載就可以了,但是由於下載的文件多數是存在中文字符的,於是在代碼中使用URLEncoder對中文進行了轉碼,但是卻忽略了文件名可能存在空格,encode之後變成了 “ + ”,導致找不到下載地址,報了404。

解決方案

其實解決這個問題很簡單簡單,因爲畢竟都是字符串,只要手動替換一下就可以了。

String encodeStr = URLEncoder.encode(str, "UTF-8");
encodeStr = encodeStr.replaceAll("\\+","%20");

只需要將encode後的字符串中的 “+” 替換成%20就可以了,%20就代表空格。

也許你會考慮到如果文件名本身存在 “+” 怎麼辦,其實這個不用擔心,特殊字符在encode過程中都是被轉換的,加號會被轉換成%2B,所以彼此之間不會影響。

另外如果有不確定的轉換問題的話,可以把url放入chrome地址欄中跑一下就可以看到對應轉化成什麼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章