在Java中解析包含umlauts的URI中的主机名

4

我正在尝试解析包含主机名中字符 'ü' 的 URI 中的主机名,如下所示:

String host = new java.net.URI("http://füllmethodentafel.de").getHost();

然而,主机将为空。它与其他URI一起工作。为什么它不起作用,有任何想法吗?


我不这么认为。那么 http://www.übersetzungsbüro.de 或者 http://füllmethodentafel.de 呢?它们都可以使用(而且你可以注册这样的URL,这在几年前才成为可能)。 - lex82
你确定这个网站真的存在吗?我无法从我的电脑上看到它或使用终端ping、google chrome、firefox和opera都无法解析URL。 - BackSlash
我认为你必须对它进行转义:Javadocs“单参数构造函数要求其参数中的任何非法字符都要加引号,并保留任何已转义的八位组和其他存在的字符。” - Fildor
你尝试过使用URI.create(String)或者其中一个多参数构造函数吗?最后,你尝试过URLEncoder吗?只是出于好奇? - Fildor
同样的问题适用于URI.create(),它只是构造函数的一个包装器。对于其他构造函数,我需要知道正在尝试解析的URL的部分。 - lex82
显示剩余5条评论
1个回答

7

java.net.URI 只能解析符合 RFC 2396 的URL。这个RFC要求遵循以下规则:

  hostport      = host [ ":" port ]
  host          = hostname | IPv4address
  hostname      = *( domainlabel "." ) toplabel [ "." ]
  domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
  toplabel      = alpha | alpha *( alphanum | "-" ) alphanum

其中alphanum基本上是[a-zA-Z0-9]ü这样的字符不包括在内。

URI可以处理Punycode URL,例如http://www.xn--hostwith-e6a.com/即等同于http://www.hostwithü.com/。为此,java.net.IDN很有用。

String host = "www.hostwithü.com";
String toASCII = IDN.toASCII(host);
System.out.println(toASCII);
// www.xn--hostwith-e6a.com

1
使用不同的构造函数,例如URI(scheme, host, path, fragment),实际上会导致URISyntaxException异常,指示违反RFC 2396的禁止字符已被使用。奇怪的是,URI(str)构造函数没有抛出异常,尽管声明了抛出异常。这对我来说似乎是不一致的。 - Sebastian_H
1
@Sebastian_H 这是真的。特别是因为 URI(String) 的JavaDoc说:'@throws URISyntaxException如果给定的字符串违反RFC 2396,如上所述的偏差'。 - user1907906
非常好的答案,谢谢!URI的行为确实不一致。getAuthority()可以使用,因此我可以通过在字符串中查找“:”和“@”来使用它来剥离用户名和端口... - lex82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接