punycode 如何区分相似的 IRI?
How does punycode distinguish similar IRIs?
我一直在研究国际化资源标识符,有一件事困扰着我。
我的理解是,对于一个域名中的每个标签(xyzzy.plugh.com
有三个标签,xyzzy
、plugh
和com
),下面的过程是执行将其转换为 ASCII 表示,以便所有旧版软件都可以正常处理它:
- 如果它仅由 ASCII 字符组成,则按原样复制。
- 否则:
- 首先我们输出
xn--
,然后是所有 ASCII 字符(跳过非 ASCII 字符)。
- 然后,如果最后一个字符不是
-
,我们输出-
来区分ASCII和非ASCII。
- 最后,我们使用 punycode 对每个非 ASCII 字符进行编码,使它们看起来像 ASCII。
那么我的问题是:我们如何区分以下两个 Unicode URI?
http://aa☃.net/
http://☃aa.net/
在我看来,两者 都将编码为:
http://xn--aa-nfh.net/
仅仅是因为整个标签的测序信息丢失了。
或者我在规范中遗漏了什么?
根据one punycode encoder,有不同的编码:
aa☃.net -> xn--aa-gsx.net
☃aa.net -> xn--aa-esx.net
^
see here
relevant RFC 3492 详细说明了为什么会这样。首先,它在介绍中提供了线索:
Uniqueness: There is at most one basic string that represents a given extended string.
Reversibility: Any extended string mapped to a basic string can be recovered from that basic string.
这意味着每个 basic/extended 字符串对必须存在可区分的一对一映射。
了解它如何区分这两种可能性需要了解解码器(将基本字符串转换回扩展字符串的东西,以及它所有的 Unicode 荣耀)。
解码器从基本字符串 aa.net
开始,并带有指向第一个 a
的指针,然后应用一系列增量,例如 gsx
或 esx
.
增量实际上编码了两个东西。第一个是要完成的非插入次数,第二个是实际插入。
因此,gsx
(aa☃.net
中的增量)将编码两个非插入(跳过 aa
),然后插入 ☃
。 esx
增量(对于 ☃aa.net
)将编码零个非插入,然后插入 ☃
.
这就是将位置编码到基本字符串中的方式。
我一直在研究国际化资源标识符,有一件事困扰着我。
我的理解是,对于一个域名中的每个标签(xyzzy.plugh.com
有三个标签,xyzzy
、plugh
和com
),下面的过程是执行将其转换为 ASCII 表示,以便所有旧版软件都可以正常处理它:
- 如果它仅由 ASCII 字符组成,则按原样复制。
- 否则:
- 首先我们输出
xn--
,然后是所有 ASCII 字符(跳过非 ASCII 字符)。 - 然后,如果最后一个字符不是
-
,我们输出-
来区分ASCII和非ASCII。 - 最后,我们使用 punycode 对每个非 ASCII 字符进行编码,使它们看起来像 ASCII。
- 首先我们输出
那么我的问题是:我们如何区分以下两个 Unicode URI?
http://aa☃.net/
http://☃aa.net/
在我看来,两者 都将编码为:
http://xn--aa-nfh.net/
仅仅是因为整个标签的测序信息丢失了。
或者我在规范中遗漏了什么?
根据one punycode encoder,有不同的编码:
aa☃.net -> xn--aa-gsx.net
☃aa.net -> xn--aa-esx.net
^
see here
relevant RFC 3492 详细说明了为什么会这样。首先,它在介绍中提供了线索:
Uniqueness: There is at most one basic string that represents a given extended string.
Reversibility: Any extended string mapped to a basic string can be recovered from that basic string.
这意味着每个 basic/extended 字符串对必须存在可区分的一对一映射。
了解它如何区分这两种可能性需要了解解码器(将基本字符串转换回扩展字符串的东西,以及它所有的 Unicode 荣耀)。
解码器从基本字符串 aa.net
开始,并带有指向第一个 a
的指针,然后应用一系列增量,例如 gsx
或 esx
.
增量实际上编码了两个东西。第一个是要完成的非插入次数,第二个是实际插入。
因此,gsx
(aa☃.net
中的增量)将编码两个非插入(跳过 aa
),然后插入 ☃
。 esx
增量(对于 ☃aa.net
)将编码零个非插入,然后插入 ☃
.
这就是将位置编码到基本字符串中的方式。