Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.net.URI被主机部分中的特殊字符阻塞_Java_Http_Url Encoding - Fatal编程技术网

java.net.URI被主机部分中的特殊字符阻塞

java.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

我有一个URI字符串,如下所示:

我正在用这个字符串创建一个java.lang.URI实例,它成功了,但是当我想要检索主机时,它返回null。Opera和Firefox也会被这个URL阻塞,如果我完全按照上面所示输入它的话。但是如果URI类无效,它不应该抛出URISyntaxException吗?那么我如何检测URI是非法的呢

当我使用URLDecoder解码字符串时,它的行为也相同,这会产生

christlicheparteiösterreichs.at/steiermark/

现在Opera和Firefox都接受了这一点,但java.net.URI仍然不喜欢它。我如何处理这样的URL


谢谢

在主机名中编码非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字符串。这可能会导致意外后果。