這幾天在寫一個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節點,如下圖
這樣設置好了後再測試就成功了!成功下載到了帶中文的歌曲名字。希望對大家有幫助。