6

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

http://www.christlichepartei%F6sterreichs.at/steiermark/

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

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

http: //www.christlicheparteiösterreichs.at/steiermark/

现在这已被 Opera 和 Firefox 接受,但 java.net.URI 仍然不喜欢它。我该如何处理这样的 URL?

谢谢

4

3 回答 3

4

Java 6 具有IDN处理国际化域名的类。因此,以下生成带有编码主机名的 URI:

URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");
于 2010-09-27T12:20:54.560 回答
2

在主机名中编码非 ASCII 字符的正确方法称为“Punycode”

于 2010-09-27T12:15:35.333 回答
2

当您选择适当的构造函数时, 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

关于鸡蛋问题的更新:

您可以让 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 的问题。以它为起点。

于 2010-09-27T15:11:14.687 回答