我的URL对象的路径包含unwise characters (RFC 2396),在我的情况下它是“|” (管)字符。
现在我需要安全地将其转换为URI,但URL.toURI()
会抛出异常。
我读过URL documentation但这部分让我感到困惑:
URL类本身不会对任何URL组件进行编码或解码 根据RFC2396中定义的转义机制。它是 调用者负责编码需要的任何字段 在调用URL之前进行转义,并解码任何转义字段, 从URL返回的。此外,因为URL不知道 URL转义,它不识别编码之间的等价 或相同网址的解码形式。
那我该怎么办呢?在转换过程中对此字符进行编码的模式是什么?我是否需要创建URL对象的编码副本?
答案 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;