java.net.URI对主机部分中的特殊字符进行了扼流

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

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

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

当我使用产生的URLDecoder解码字符串时,它的行为也相同

http:// www.christlicheparteiösterreichs.at/ steiermark /

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

谢谢

Java 6具有IDN类以使用国际化域名。 因此,以下生成带编码主机名的URI:

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

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

当您选择适当的构造函数时, URI会抛出URISyntaxException :

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

java.net.URISyntaxException:索引28处主机名中的非法字符: http:// 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的所有问题。 以此为出发点。