如何解析动态字符串值以创建URL实例?我需要用%20
,重音符号,非ASCII字符替换空格......?
我尝试使用URLEncoder
但它也编码/
字符,如果我将一个用URLEncoder
编码的字符串给URL构造函数,我得到一个MalformedURLException
(没有协议) )。
答案 0 :(得分:34)
URLEncoder
有一个非常误导性的名称。它是根据使用MIME类型application/x-www-form-urlencoded
的{{3}}使用的编码格式参数。
据说这可以用于编码例如查询参数。例如,如果参数看起来像&/?#
,则其编码的等效项可用作:
String url = "http://host.com/?key=" + URLEncoder.encode("&/?#");
除非您有这些特殊需求,Javadocs建议使用URL javadocs根据new URI(..).toURL
执行URI编码。
管理URL编码和解码的推荐方法是使用URI
以下示例
new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL();
生成结果http://host.com/path/?key=%7C%20?/%23ä#fragment
。请注意?&/
等字符不编码的字符。
有关详细信息,请参阅帖子RFC2396或HTTP URL Address Encoding in Java。
编辑
由于您的输入是字符串URL,因此使用URI
的参数化构造函数之一将无法帮助您。您也不能直接使用new URI(strUrl)
,因为它不引用URL参数。
所以在这个阶段我们必须使用技巧来获得你想要的东西:
public URL parseUrl(String s) throws Exception {
URL u = new URL(s);
return new URI(
u.getProtocol(),
u.getAuthority(),
u.getPath(),
u.getQuery(),
u.getRef()).
toURL();
}
在使用此例程之前,您必须清理字符串以确保它代表绝对 URL。我看到了两种方法:
猜测。将http://
添加到字符串中,除非它已经存在。
答案 1 :(得分:3)
所以你要说的是你要编码部分网址而不是整个网页。听起来像你必须把它分成几部分,传递你想要通过编码器编码的部分,并重新组装它以获得你的整个URL。