4

我有一个带有地址栏的应用程序,用户输入我必须连接的 IRI。

在 unix/Darwin 上,这很简单:我将 IDN 扁平化为 URI,如 RFC3987 中所述。也就是说,如果该方案有一个授权部分,我将它映射到带有 punycode 的 ASCII,然后在 IRI 的其余部分中对任何非 ASCII 字符进行百分比编码。

在 Windows 上,有两种可能性:要么域名是普通的互联网域名,在这种情况下,它应该使用 punycode 映射到 ASCII 并使用普通 DNS 查找。或者,域名是一个奇怪的 Windows 域名(例如 Active Directory DNS 服务器),查找实际上应该是 UTF-8。

例子

  • 用户类型http://☃.net:通话getaddrinfo(service="xn--n3h.net")
  • 用户类型http://dryden.internal.corp.com:调用getaddrinfo(service="dryden.internal.corp.com")将正常工作。
  • 用户类型http://pöp.internal.corp.com
    • 如果“pöp”是 UTF-8 DNS 发布的机器名称,则调用getaddrinfo(service="xn--pp-fka.internal.corp.com")不起作用。
    • 调用GetAddrInfoW(service=T"pöp.internal.corp.com")工作。

Firefox 和 Chrome 都在任何 IRI 上立即执行 punycode,因此无法解析奇怪的 Microsoft 域。

指导方针?

在这样的环境中处理 IRI 有哪些指导方针?是否有任何推荐的方法来猜测应该进行哪种 DNS 查找,punycode 或 UTF-8 DNS?其他应用程序是做什么的?

我目前对解决方案的最佳尝试是,如果它是公共 TLD,则首先执行 punycode,但如果 TLD 是内部的,则跳过尝试 punycode(acme.com 可能服务于公共事物,acme.ltd 可能是一个 Intranet)。如果 punycode 失败或被跳过,我会尝试 UTF-8 查询。

4

1 回答 1

2

有一种解决方法会对响应时间产生负面影响 - 如果没有其他帮助,您可以尝试使用这两种方法进行 2 次调用,并从第一个调用中获取成功。

于 2013-06-25T13:05:54.453 回答