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的所有问题。 以此为出发点。