我有一个带有地址栏的应用程序,并且用户键入必须连接的IRI。
在UNIX/Darwin上,这很简单:我按照RFC3987中所述将IDN展平为一个URI。就是说,如果该方案有一个授权部分,我将其用punycode映射到ASCII,然后在IRI的其余部分中对所有非ASCII字符进行百分比编码。
在Windows上,有两种可能:域名是普通的Internet域名,在这种情况下,应使用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)?其他应用程序有什么作用?
我目前在解决方案上的最佳尝试是,如果它是公共(public)TLD,则首先执行punycode,但是如果TLD是内部的,则跳过尝试punycode(acme.com可能服务于公共(public)事务,acme.ltd可能是一个Intranet)。如果punycode失败或被跳过,我尝试使用UTF-8查询。
最佳答案
有一个对响应时间有负面影响的解决方法-如果没有其他帮助,您可以尝试使用这两种方法进行2次调用,并从第一个方法获取响应以成功。