6

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

我已经阅读了URL 文档,但这部分让我感到困惑:

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

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

4

3 回答 3

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*/);

看起来它有效,这是一个例子。有人可以确认这是正确的解决方案吗?

编辑:当有查询时,最初的解决方案有一些问题,所以我已经修复了它。

于 2012-11-23T14:34:28.163 回答
1

使用 URL 编码?

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

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 编码工作并处理路径中的所有不明智的字符。

于 2012-11-23T14:42:12.543 回答
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;
于 2013-02-04T22:09:12.330 回答