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

在UNIX/Darwin上,这很简单:我按照RFC3987中所述将IDN展平为一个URI。就是说,如果该方案有一个授权部分,我将其用punycode映射到ASCII,然后在IRI的其余部分中对所有非A​​SCII字符进行百分比编码。

在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次调用,并从第一个方法获取响应以成功。

    09-06 19:01