这几天在写一个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节点,如下图
这样设置好了后再测试就成功了!成功下载到了带中文的歌曲名字。希望对大家有帮助。