java.net.URI被主机部分中的特殊字符阻塞
我有一个URI字符串,如下所示: 我正在用这个字符串创建一个java.lang.URI实例,它成功了,但是当我想要检索主机时,它返回null。Opera和Firefox也会被这个URL阻塞,如果我完全按照上面所示输入它的话。但是如果URI类无效,它不应该抛出URISyntaxException吗?那么我如何检测URI是非法的呢 当我使用URLDecoder解码字符串时,它的行为也相同,这会产生 christlicheparteiösterreichs.at/steiermark/ 现在Opera和Firefox都接受了这一点,但java.net.URI仍然不喜欢它。我如何处理这样的URLjava.net.URI被主机部分中的特殊字符阻塞,java,http,url-encoding,Java,Http,Url Encoding,我有一个URI字符串,如下所示: 我正在用这个字符串创建一个java.lang.URI实例,它成功了,但是当我想要检索主机时,它返回null。Opera和Firefox也会被这个URL阻塞,如果我完全按照上面所示输入它的话。但是如果URI类无效,它不应该抛出URISyntaxException吗?那么我如何检测URI是非法的呢 当我使用URLDecoder解码字符串时,它的行为也相同,这会产生 christlicheparteiösterreichs.at/steiermark/ 现在Oper
谢谢在主机名中编码非ASCII字符的正确方法称为 Java6拥有处理国际化域名的类。因此,以下内容生成带有编码主机名的URI:
URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");
当您选择适当的构造函数时,抛出一个:
URI someUri=new URI("http","www.christlicheparteiösterreichs.at","/steiermark",null);
java.net.URISyntaxException:索引28处主机名中的非法字符:.christlicheparteiösterreichs.at/steiermark
您可以使用此来修复:
URI someUri=new URI("http",IDN.toASCII("www.christlicheparteiösterreichs.at"),"/steiermark",null);
System.out.println(someUri);
System.out.println("host: "+someUri.getHost()));
输出:
主持人:www.xn--christlicheparteesterreichs-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的问题。将其作为起点。您好。感谢您的回答,但是当我没有URL的各个部分时,URI构造函数如何帮助我呢。这有点鸡和蛋的问题:)你说得对。这取决于你从哪里获得数据。如果您得到一个像“”这样的字符串作为输入,您就不能在新的URI(字符串)中使用它,因为JavaDoc声明,它需要一个已经正确的URI字符串。但是这个字符串不是。您必须检查数据流中字符串的“损坏”位置。这根绳子是从哪里来的?嗨,谢谢你花时间来研究这个。你的更新中的建议看起来很有希望,我可能可以这样做。再次感谢
IDN#toASCII
仅用于标签或完整域名,而不是整个URI字符串。这可能会导致意外后果。