9

第一件事:

在将每个域名转换为其 IDNA 版本之后,我将多个域存储到数据库中。我需要知道这样一个 IDNA 转换的域名可以具有的最大长度,以便我可以定义数据库字段的最大长度。

已知事实:

现在,我知道域名(包括任何子域)中的最大字符数是 255 个字符。

我丢的地方:

乍一看很容易,但是……这是否意味着国际字符的常规 ascii 字符(想想 UTF-8 编码)?

举个例子:当我忽略“ü”是一个需要更多字节来表示的国际字符时,域“müller.de”有 9 个字符。“müller.de”的 IDNA 版本是“xn--mller-kva.de”,它有 16 个字符。这表明最大长度肯定存在差异,具体取决于“是否”它是否被 IDNA 转换。

根据它们所指的字符类型,最多 255 个字符可能是国际字符版本、IDNA 转换版本,甚至两者兼而有之。

这就是我失去它的地方......尤其是,因为我必须考虑到并非所有域都是理智的,并且像“öüßüöäéèê.example.äöüßüöäéèê-äöüßüöäéèêê.test.äöüßüöäéèêêê.com”之类的东西更糟糕的是被期望。

因此,“猜测”和“希望最好”不是一种选择。我需要确定...

问题是:

基于已知的事实,域名(包括任何子域)中的最大字符数为 255 个字符...... IDNA 转换域名的最大长度是多少?

或者他们是否意味着 IDNA 转换版本(punycode)也被限制为 255 个字符(这意味着具有国际/unicode 字符的域实际上在其 unicode 表示中的限制更短,因为他们的 IDNA 转换版本必须尊重 255 个字符限制)?

4

3 回答 3

8

好的,我想我发现了自己,我发现的这个片段(通过搜索互联网)帮助了:

引入国际化域名 (IDN) 基本上有两种不同的选择。首先是对域名系统 (DNS) 进行调整,允许直接使用 unicode 字符。有人觉得这个措施太激进了,所以选择了第二种方案。这涉及编译一种算法来指定如何将 unicode 字符串转换为允许的 ASCII 域名。然后将此 ACE 字符串(ACE 代表 ASCII 兼容编码)输入 DNS。IDN 的引入意味着,DNS 中的条目第一次不再与域名相同。

来源

答案是尊重的长度是 255 个字符的限制,正如 DNS 所期望的那样。

我的怀疑是正确的。DNS 中的域名和条目在 IDN 中是两个不同的东西。重要的是 DNS 条目的最大长度。

域名“müller.de”有 9 个字符,但对应的 ACE(ASCII 兼容编码)字符串“xn--mller-kva.de”有 16 个字符。

它是 DNS 使用的 ACE 字符串,它是低于 255 个字符限制的 ACE 字符串。这意味着它的 unicode(域)版本的最大限制由使用的 unicode 字符数定义,并且如果 - 在 IDNA 转换之后 - 字符串仍然符合 255 个字符的限制。

天哪,规格肯定会在这样的事情上更清楚一些。尤其是国际域名自 2004 年 3 月 1 日左右就已存在。但我找到了答案,这才是最重要的。

也许这可以帮助有同样问题的人。

与我的数据库字段长度相关的简单答案是 255 个字符。

我将域名存储在其 IDNA 转换(punycode/ACE 字符串)版本中的事实仅证实了这个最大字符限制。

于 2012-01-03T20:57:12.477 回答
6

我的理解是 255 个字符的限制是在 IDNA 转换之后考虑的。

这是因为 DNS 记录有这个字符限制,通常 DNS 记录只能包含字母、数字和连字符(来自 Wikipedia)。因此,DNS 服务器使用 IDN 的 Punycode 版本而不是 Unicode 版本作为记录。

于 2012-01-03T20:57:55.387 回答
-2

RFC3492对 os IDNA 编码的其中一项特性进行了说明:

高效编码:基本字符串长度与扩展字符串长度的比例很小。这在域名上下文中很重要,因为RFC1034将域标签的长度限制为 63 个字符。

这就对了。63 个字符是任何域名的最大长度,无论它是 IDNA 还是 ASCII。

于 2016-08-24T10:44:15.383 回答