哪些Unicode字符可以在IDN主机标签中使用?

9

我目前正在开发一个“正式”的URI验证器,目前所有工作都集中在主机名验证上;其余部分并不那么棘手。

我卡在了IDN主机名标签上(即包含Unicode的标签;可能的punycode编码字符串已在此时解码)。

我的第一个想法基本上是为不支持IDN的TLDs和支持IDN的TLDs各使用一个正则表达式。这可能可以基于Mozilla的IDN启用TLD列表。分别为^[a-zA-Z0-9\-]+$^[a-zA-Z0-9\-\p{L}]+$。然而,这不是理想的情况,因为每个IDN注册机构都可以决定允许哪些字符。

我正在寻找一个适当、一致、最新的数据表,其中包含各种TLDs允许的Unicode字符。看起来我必须在俄罗斯和中国的注册机构网站上自己找到所有数据(这非常困难)。

在我试图收集所有这些数据之前,我想知道是否已经存在这样的列表。或者是否有更好的方法、最佳/常见做法等等?(我希望验证尽可能严格。)

2个回答

4

1

你无法将所有Unicode域名转换为punycode并验证吗?由于DNS不支持真正的UTF-8字符,因此这可能是最佳解决方案。


是的,我也考虑过这个问题。但是这涉及到用户输入的问题...我不能要求我的用户首先填写转换为punycode的URI。所以,我只能将其内部转换为punycode(这可能是你想表达的),但这并不意味着主机名必须是真正有效的(如果我错了,请纠正我),因此在这种情况下,匹配任何Unicode字符(\p{L})并将其视为有效基本上是相同的。如果我找不到一个好的解决方案,最后的选择将是我的备选方法;如果是这种情况,您会建议使用Mozilla提供的列表(例如2个正则表达式)吗? - Roland Franssen
为了澄清上面的内容: 在Mozilla上列出的顶级域名 -> [a-zA-Z0-9-\p{L}] / 所有其他顶级域名 -> [a-ZA-Z0-9-] 这是否是适当的验证? - Roland Franssen
这取决于编码器。一些编码器将输入转换为IDNA并应遵循RFC5892。其他编码器转换为punycode,不必遵循RFC5892。检查起来非常容易,只需输入克林贡DNS名称,如果收到punycode,则编码器不遵循RFC5892(克林贡字母表在RFC5892禁止使用的代码点范围内)。 - Klaws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接