我正在尝试解析包含主机名中字符 'ü' 的 URI 中的主机名,如下所示:
String host = new java.net.URI("http://füllmethodentafel.de").getHost();
然而,主机将为空。它与其他URI一起工作。为什么它不起作用,有任何想法吗?
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
URI(scheme, host, path, fragment)
,实际上会导致URISyntaxException
异常,指示违反RFC 2396的禁止字符已被使用。奇怪的是,URI(str)
构造函数没有抛出异常,尽管声明了抛出异常。这对我来说似乎是不一致的。 - Sebastian_HURI(String)
的JavaDoc说:'@throws URISyntaxException如果给定的字符串违反RFC 2396,如上所述的偏差'。 - user1907906
URI.create(String)
或者其中一个多参数构造函数吗?最后,你尝试过URLEncoder吗?只是出于好奇? - Fildor