java.net.URI中的扼流圈在主机部分特殊字符

问题描述:

我有一个URI字符串类似如下:java.net.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仍然不喜欢它。我该如何处理这样的网址?

感谢

Java 6中具有IDN类国际化域名工作。所以,下面的产生与URI编码的主机名:

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

非常好,谢谢! – 2010-09-27 12:40:49

+2

“IDN#toASCII”仅用于标签或完整域名,而不是完整的URI字符串。这可能会导致意想不到的后果。 – NickAldwin 2014-07-17 20:59:49

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

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的所有问题。用它作为起点。

+0

嗨。感谢您的回答,但是当我没有URL的各个部分时,URI构造函数如何帮助我。这是一个鸡和鸡蛋的问题:) – 2010-09-28 08:02:50

+0

你是对的。这取决于你从哪里获得数据。如果你得到一个像“http://www.christlicheparteiösterreichs.at/steiermark/”这样的字符串作为输入,你不能在新的URI(字符串)中使用它,因为JavaDoc指出,它需要一个已经正确的URI-String。但是这个字符串不是。您必须检查数据流中字符串“损坏”的位置。这个字符串从哪里来? – 2010-09-28 08:44:41

+0

嗨,感谢您花时间研究这一点。您的更新中的建议看起来很有希望,我可能可以使用它。再次感谢! – 2010-09-30 09:25:02