關於android在TOMCAT伺服器下載檔名帶中文的檔案的編碼問題
阿新 • • 發佈:2019-02-13
這幾天在寫一個MP3播放器,在從伺服器下載歌曲的時候遇到了編碼問題,著實頭疼了一整天,不過慶幸在睡覺前解決了該問題。在這裡寫下我的心路歷程,供大家參考。
相信大家在從伺服器下載的時候要用到HttpURLConnection這個類,.最開始我是在這裡報錯HttpURLConnection.getInputStream(),就是程式碼中的InputStream inputStream = urlConn.getInputStream();
<span style="font-size:18px;"><pre name="code" class="java"> url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.connect(); int code = urlConn.getResponseCode(); InputStream inputStream = urlConn.getInputStream(); return inputStream; </span>
<span style="font-size:18px;"></pre><pre name="code" class="html"></span>
錯誤是FileNotFoundException,就是檔案沒找到,但是我反覆檢查伺服器目錄,確實是存在這個檔案的。如圖:
思索了半天想到有可能是編碼問題,可能檔名是中文導致了找不到檔案。當機立斷把 我的歌聲裡.mp3 改成了 a1.mp3,果然改成英文數字後,沒報錯,下載成功過了。這樣就可以肯定是中文名導致了找不到檔案。於是我在網上搜索了很久,大多數解決方案都沒解決我的問題,最多的解決方案是
fileName = URLEncoder.encode(fileName, "utf-8");
核心的思想是對了,但是這樣直接使用會有點小問題,可能把字尾什麼的也轉碼了,參考下列方法
<span style="font-size:18px;"><pre name="code" class="java"> /** * 替換字串卷 * * @param str 被替換的字串 * @param charset 字符集 * @return 替換好的 * @throws UnsupportedEncodingException 不支援的字符集 */ public static String encode(String str, String charset) throws UnsupportedEncodingException { Pattern p = Pattern.compile(zhPattern); Matcher m = p.matcher(str); StringBuffer b = new StringBuffer(); while (m.find()) { m.appendReplacement(b, URLEncoder.encode(m.group(0), charset)); } m.appendTail(b); return b.toString(); }</span>
str是你的URL路徑,裡面可以傳完整路徑,charset是你需要轉成的編碼。使用該方法後我欣喜的萬分去除錯,可是錯誤並未解決,還是同樣的FileNotFoundException,我又陷入了思索,客戶端沒問題了,會不會是伺服器的問題,我急忙去看了我的歌曲資原始檔(我儲存歌曲資訊的XML)和server.xml,都是UTF-8啊!截圖看下面
兩個XML開頭都聲明瞭編碼格式,但是大家注意了,重點來了,這樣設定是有問題的,我們真正要設定編碼格式的地方在server.xml中的Connector節點,如下圖
這樣設定好了後再測試就成功了!成功下載到了帶中文的歌曲名字。希望對大家有幫助。