应用场景
SVN上存放了一个Excel文件A.xlsx,随时都可以会更新其中的数据。我要用该A.xlsx作为数据源,读取数据并显示在一个web页面上。
原文件路径
http://192.168.81.33:8080/svn/SVN_DB/Sender/doc/wireless5.5/H5 url 跳转相关内容/5.5Hybird跳转URL列表.xlsx
浏览器编码之后的文件路径
可以明确的知道是用了UTF-8编码;用HttpURLConnection直接访问下面的路径,可以正确的获取到数据。
用Java的URLEncode编码原路径得到的结果如下
这里也用了UTF-8编码;用HttpURLConnection直接访问下面的路径,返回404 Not Found 。
http%3A%2F%2F192.168.81.33%3A8080%2Fsvn%2FSVN_DB%2FSender%2Fdoc%2Fwireless5.5%2FH5+url+%E8%B7%B3%E8%BD%AC%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%2F5.5Hybird%E8%B7%B3%E8%BD%ACURL%E5%88%97%E8%A1%A8.xlsx
修改方法
用编码过后的URL差异看出
- Java的URLEncode对原URL中的“:”“/”也做了编码
- 另外Java的URLEncode对原URL中的空格编码之后的值是“+”。而浏览器对URL中空格的编码值是“%20”;
- 经过测试Java的URLEncode对“+”编码之后的值是%2B
于是自己实现了如下的Java版的URL编码函数:
private String encodeURL(String url,String encode) { if(url == null || url.length() <= 0) return null; URL temp; String encodedUrl=""; try { temp = new URL(url); encodedUrl += temp.getProtocol(); encodedUrl += "://"+temp.getHost()+":"; encodedUrl += temp.getPort(); String path = temp.getPath(); String[] paths = path.split("/"); for(String str : paths) { str = URLEncoder.encode(str,encode); encodedUrl += str+"/"; } } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return encodedUrl.substring(0,encodedUrl.length()-1).replace("+", "%20"); }