关于android在TOMCAT服务器下载文件名带中文的文件的编码问题

android 专栏收录该内容
1 篇文章 0 订阅

这几天在写一个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节点,如下图



这样设置好了后再测试就成功了!成功下载到了带中文的歌曲名字。希望对大家有帮助。

  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值