我有包含不明智的字符(RFC 2396)路径的URL对象--在我的例子中--它是“\”(管道)字符。现在我需要安全地将其转换为URI,但是URL.toURI()会抛出一个异常。
我读过URL文档,但这部分让我感到困惑:
URL类本身并不根据RFC2396中定义的转义机制对任何URL组件进行编码或解码。调用方有责任对调用URL之前需要转义的任何字段进行编码,并对从URL返回的任何转义字段进行解码。此外,因为URL不知道URL转义,所以它不承认同一URL的编码或解码形式之间的等价性。
那我该怎么做呢?在转换过程中编码这些字符的模式是什么?是否需要创建URL对象的编码副本?
发布于 2012-11-23 14:34:28
好吧,我想出了这样的点子:
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*/);看起来很管用,下面是一个例子。有人能确认这是正确的解决办法吗?
编辑__:http://ideone.com/tCl7Yb在查询时出现了一些问题,所以我已经修复了它。
发布于 2012-11-23 14:42:12
使用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编码处理路径中所有不明智的字符。
发布于 2013-02-04 22:09:12
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;https://stackoverflow.com/questions/13530019
复制相似问题