java.net.URI中的扼流圈在主机部分特殊字符
我有一个URI字符串类似如下:java.net.URI中的扼流圈在主机部分特殊字符
我创建一个java.lang.URI实例与此字符串,并将其成功,但是当我想要检索主机返回null。 Opera和Firefox也呛这个URL,如果我正好进入它,如上图所示。但不应URI类抛出的URISyntaxException,如果它是无效的?我如何检测到URI是非法的呢?
它还相同的行为,当我使用解码其中URLDecoder产生
http://www.christlicheparteiösterreichs.at/施泰尔马克/
现在,这是由Opera和Firefox,但java.net接受字符串.URI仍然不喜欢它。我该如何处理这样的网址?
感谢
Java 6中具有IDN
类国际化域名工作。所以,下面的产生与URI编码的主机名:
URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");
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
UPDATE关于鸡-egg-问题:
你可以让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的所有问题。用它作为起点。
嗨。感谢您的回答,但是当我没有URL的各个部分时,URI构造函数如何帮助我。这是一个鸡和鸡蛋的问题:) – 2010-09-28 08:02:50
你是对的。这取决于你从哪里获得数据。如果你得到一个像“http://www.christlicheparteiösterreichs.at/steiermark/”这样的字符串作为输入,你不能在新的URI(字符串)中使用它,因为JavaDoc指出,它需要一个已经正确的URI-String。但是这个字符串不是。您必须检查数据流中字符串“损坏”的位置。这个字符串从哪里来? – 2010-09-28 08:44:41
嗨,感谢您花时间研究这一点。您的更新中的建议看起来很有希望,我可能可以使用它。再次感谢! – 2010-09-30 09:25:02
非常好,谢谢! – 2010-09-27 12:40:49
“IDN#toASCII”仅用于标签或完整域名,而不是完整的URI字符串。这可能会导致意想不到的后果。 – NickAldwin 2014-07-17 20:59:49