我有一个如下所示的URI字符串:
我正在用这个字符串创建一个java.lang.URI实例并且它成功但是当我想要检索主机时它返回null。如果我完全按照上面的说明输入它,Opera和Firefox也会阻塞此URL。但是如果URI类无效,那么它应该抛出URISyntaxException吗?如何检测到URI是非法的呢?
当我使用生成
的URLDecoder解码字符串时,它的行为也相同http://www。christlicheparteiösterreichs.at/施泰尔马克/
现在这已被Opera和Firefox接受,但java.net.URI仍然不喜欢它。我该如何处理这样的URL?
感谢
答案 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 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的所有问题。以此为出发点。