2013-07-12 22 views
2

说我有一个URL的空间,什么是正确的方法来将其转换为%20?请不要'取代'建议。在Java中,如何获得规范化的网址

例如,如果你把“http://test.com/test和测试/ a”的浏览器窗口,将其转换为http://test.com/test%20and%20test/a

如果我使用URLEncoder的,我得连/转换。这不是我想要的。

谢谢,

这是正确的方式,好像。添加到问题中,如果在路径中还有一些非ASCII代码,我想用utf8编码转换为有效的url,该怎么办?例如:test.com:8080/test和test /pierlag2_carré/ a?query =世界我希望它被转换为test.com:8080/test%20and%20test/pierlag2_carr%C3%A9/a?query= %E4%B8%96%E7%95%8C

+1

在构建URL之前,您应该对需要编码的URL部分进行编码。 –

回答

3

在Java中建立URL的正确方法是创建一个URI对象并填写URL的每个部分。 URI类处理URL的不同部分的编码规则,因为它们各不相同。

URLEncoder是不是你想要的,尽管它的名字,因为它实际上是HTML表单编码。

编辑:

根据您的意见,您收到的网址输入到您的应用程序并不会控制初始生成的URL。您目前遇到的真正问题是您收到的输入URL(URL)不是有效的URL。每个规范的URL/URI不能包含空格(因此浏览器中的%20)。

既然你在无效的输入无法控制你将被迫进入的URL拆分成其组成部分:

  • 方案
  • 主机
  • 路径

然后您将不得不拆分路径并分别对每个部分进行编码,以确保您不会无意中编码划定路径片段的/

最后,您可以将所有这些对象放回到一个URI对象中,然后将它们传递给您的应用程序。

+0

但我的情况是,网址是输入,不属于我...... – user1992313

+0

@ user1992313 - 这就是URI类的create(String uri)方法的用途。 – gregwhitaker

+0

当你传递一个带有空格的url时,URI.create实际上会抛出异常 – user1992313

-3

您可能会发现有用的代码替换您的网址空格:与URL类的帮助

String myUrl = "http://test.com/test and test/a"; 
myUrl = myUrl.replaceAll(" ", "%20"); 

URI url = new URI(myUrl); 
System.out.print(url.toString()); 
+3

是不是这个提问者告诉我们他不想要的东西? –

+0

它也只处理许多情况之一。 JDK包含一个解决方案。用它。 -1 – EJP

4

尝试拆分成URI

String sUrl = "http://test.com:8080/test and test/a?query=world"; 
URL url = new URL(sUrl); 
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
String canonical = uri.toString(); 
System.out.println(canonical); 

输出:

http://test.com:8080/test%20and%20test/a?query=world 
+0

这是正确的方式,看起来像。添加到问题中,如果在路径中还有一些非ASCII代码,我想用utf8编码转换为有效的url,该怎么办? 如: http://test.com:8080/test和测试/pierlag2_carré/查询=世界 我希望它转换为 http://test.com:8080/test% 20和%20test/pierlag2_carr%C3%A9/a?query =%E4%B8%96%E7%95%8C – user1992313

+0

您可以将该示例添加到您的问题中吗?该评论正在截断文本。 – acdcjunior

+0

好的,我在主要问题中添加了全文。 – user1992313