java.net.URI会阻塞主机部分中的特殊字符

时间:2010-09-27 11:52:50

标签: java http url-encoding

我有一个如下所示的URI字符串:

  

http://www.christlichepartei%F6sterreichs.at/steiermark/

我正在用这个字符串创建一个java.lang.URI实例并且它成功但是当我想要检索主机时它返回null。如果我完全按照上面的说明输入它,Opera和Firefox也会阻塞此URL。但是如果URI类无效,那么它应该抛出URISyntaxException吗?如何检测到URI是非法的呢?

当我使用生成

的URLDecoder解码字符串时,它的行为也相同
  

http://www。christlicheparteiösterreichs.at/施泰尔马克/

现在这已被Opera和Firefox接受,但java.net.URI仍然不喜欢它。我该如何处理这样的URL?

感谢

3 个答案:

答案 0 :(得分:4)

Java 6具有IDN类来处理国际化域名。因此,以下内容生成带编码主机名的URI:

URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");

答案 1 :(得分:2)

在主机名中编码非ASCII字符的正确方法称为"Punycode"

答案 2 :(得分:2)

当您选择适当的构造函数时,

URI会抛出URISyntaxException

URI someUri=new URI("http","www.christlicheparteiösterreichs.at","/steiermark",null);
  

java.net.URISyntaxException:索引28处主机名中的非法字符:http://www。christlicheparteiösterreichs.at/ steiermark

您可以使用IDN来解决此问题:

URI someUri=new URI("http",IDN.toASCII("www.christlicheparteiösterreichs.at"),"/steiermark",null);
System.out.println(someUri);
System.out.println("host: "+someUri.getHost()));

输出:

  

http://www.xn--christlicheparteisterreichs-5yc.at/steiermark

     

主持人:www.xn--christlicheparteisterreichs-5yc.at

更新关于鸡蛋问题:

您可以让URL完成工作:

public static URI createSafeURI(final URL someURL) throws URISyntaxException
{
return new URI(someURL.getProtocol(),someURL.getUserInfo(),IDN.toASCII(someURL.getHost()),someURL.getPort(),someURL.getPath(),someURL.getQuery(),someURL.getRef());    
}


URI raoul=createSafeURI(new URL("http://www.christlicheparteiösterreichs.at/steiermark/readme.html#important"));

这只是一个快速搜索,没有检查有关将URL转换为URI的所有问题。以此为出发点。