我有一个带有地址栏的应用程序,用户输入我必须连接的 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")
工作。
- 如果“pöp”是 UTF-8 DNS 发布的机器名称,则调用
Firefox 和 Chrome 都在任何 IRI 上立即执行 punycode,因此无法解析奇怪的 Microsoft 域。
指导方针?
在这样的环境中处理 IRI 有哪些指导方针?是否有任何推荐的方法来猜测应该进行哪种 DNS 查找,punycode 或 UTF-8 DNS?其他应用程序是做什么的?
我目前对解决方案的最佳尝试是,如果它是公共 TLD,则首先执行 punycode,但如果 TLD 是内部的,则跳过尝试 punycode(acme.com 可能服务于公共事物,acme.ltd 可能是一个 Intranet)。如果 punycode 失败或被跳过,我会尝试 UTF-8 查询。