应用场景

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直接访问下面的路径,可以正确的获取到数据。

http://192.168.81.33:8080/svn/SVN_DB/Sender/doc/wireless5.5/H5%20url%20%E8%B7%B3%E8%BD%AC%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9/5.5Hybird%e8%b7%b3%e8%bd%acURL%e5%88%97%e8%a1%a8.xlsx

用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");
}