【问题标题】:Parsing the host of a URI in Java when it contains umlauts在 Java 中解析包含变音符号的 URI 的主机
【发布时间】:2014-08-07 13:08:47
【问题描述】:

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

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

但是,主机将为空。它适用于其他 URI。任何想法为什么它不起作用?

【问题讨论】:

  • 我不这么认为。 übersetzungsbüro.defüllmethodentafel.de 怎么样(你可以注册几年前就可以使用的此类 URL)
  • @sᴜʀᴇsʜᴀᴛᴛᴀ Yes, it is.
  • 你确定这个网站真的存在吗?我在我的电脑上看不到也看不到它(尝试了终端 ping、google chrome、firefox 和 opera,他们都说无法解析 url)。
  • 我认为你必须转义它:Javadocs“单参数构造函数要求在其参数中引用任何非法字符,并保留任何转义的八位字节和其他存在的字符”
  • 是的,两者都存在。它适用于我的浏览器(chrome)。

标签: java uri


【解决方案1】:

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) 构造函数不会抛出异常,尽管声明了 throw。这对我来说似乎不一致。
  • @Sebastian_H 这是真的。特别是因为URI(String) 的 JavaDoc 说:'@throws URISyntaxException 如果给定的字符串违反了 RFC 2396,如上述偏差所增强'。
  • 完美答案,谢谢! URI 的行为似乎确实不一致。 getAuthority() 有效,因此我可以使用它通过在字符串中查找 : 和 @ 来去除用户名和端口...
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2017-11-29
  • 2014-06-13
相关资源
最近更新 更多