1. 程式人生 > >關於android在TOMCAT伺服器下載檔名帶中文的檔案的編碼問題

關於android在TOMCAT伺服器下載檔名帶中文的檔案的編碼問題

這幾天在寫一個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節點,如下圖


這樣設定好了後再測試就成功了!成功下載到了帶中文的歌曲名字。希望對大家有幫助。