将字符串解析为URL

如何解析动态字符串值以创建URL实例? 我需要用%20 ,重音符号,非ASCII字符替换空格……?

我试图使用URLEncoder但它也编码/字符,如果我将一个用URLEncoder编码的字符串给URL构造函数,我得到一个MalformedURLException (没有协议)。

URLEncoder具有非常误导性的名称。 根据Javadocs使用MIME类型application/x-www-form-urlencoded编码表单参数。

据说这可以用于编码例如查询参数 。 例如,如果参数看起来像&/?#其编码的等效项可用作:

 String url = "http://host.com/?key=" + URLEncoder.encode("&/?#"); 

除非您有这些特殊需求,否则URL javadocs建议使用new URI(..).toURL ,它根据RFC2396执行URI编码。

管理URL编码和解码的推荐方法是使用URI

以下示例

 new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL(); 

生成结果http://host.com/path/?key=%7C%20?/%23ä#fragment 。 请注意如何编码诸如?&/类的字符。

有关详细信息,请参阅Java中的postHTTP URL地址编码或如何编码URL以避免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。 我看到两种方法:

  1. 猜。 将http://到字符串中,除非它已经存在。

  2. 使用new URL(URL context, String spec)从上下文构造URI

所以你要说的是你要编码部分url而不是整个网页。 听起来像你必须把它分成几部分,传递你想要通过编码器编码的那些,并重新组装它以获得你的整个URL。