如果有不明智的字符,如何将URL转换为URI?

时间:2012-11-23 13:22:24

标签: java http url uri

我的URL对象的路径包含unwise characters (RFC 2396),在我的情况下它是“|” (管)字符。 现在我需要安全地将其转换为URI,但URL.toURI()会抛出异常。

我读过URL documentation但这部分让我感到困惑:

  

URL类本身不会对任何URL组件进行编码或解码   根据RFC2396中定义的转义机制。它是   调用者负责编码需要的任何字段   在调用URL之前进行转义,并解码任何转义字段,   从URL返回的。此外,因为URL不知道   URL转义,它不识别编码之间的等价   或相同网址的解码形式。

那我该怎么办呢?在转换过程中对此字符进行编码的模式是什么?我是否需要创建URL对象的编码副本?

3 个答案:

答案 0 :(得分:3)

好的,我想出了类似的东西:

URI uri = new URI(url.getProtocol(), 
                  null /*userInfo*/,
                  url.getHost(), 
                  url.getPort(), 
                  (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"),
                  (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"),
                  null /*fragment*/);

看起来很有效,here is an example。有人可以证实这是正确的解决方案吗?

修改initial solution在有查询时遇到了一些问题,所以我已修复它。

答案 1 :(得分:1)

使用网址编码?

从您的示例中,您目前拥有:

URL url = new URL("http", "google.com", 8080, "/crapy|path with-unwise_characters.jpg");

相反,我会使用:

String path = "/crapy|path with-unwise_characters.jpg"
URL url = new URL("http", "google.com", 8080, URLEncoder.encode(path, "UTF-8"));

这应该可以工作并按照标准URL编码处理路径中的所有不明智字符。

答案 2 :(得分:1)

HTTPClient 4有一个org.apache.http.client.utils.URIBuilder的对象:

           URIBuilder builder = 
            new URIBuilder()
        .setScheme(url.getProtocol())
        .setHost(url.getHost())
        .setPort(url.getPort())
        .setUserInfo(url.getUserInfo())
        .setPath(url.getPath())
        .setQuery(url.getQuery());
    URI uri = builder.build();
    return uri;