punycode 如何区分相似的 IRI?

How does punycode distinguish similar IRIs?

我一直在研究国际化资源标识符,有一件事困扰着我。

我的理解是,对于一个域名中的每个标签(xyzzy.plugh.com有三个标签,xyzzyplughcom),下面的过程是执行将其转换为 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 的指针,然后应用一系列增量,例如 gsxesx.

增量实际上编码了两个东西。第一个是要完成的非插入次数,第二个是实际插入。

因此,gsxaa☃.net 中的增量)将编码两个非插入(跳过 aa),然后插入 esx 增量(对于 ☃aa.net)将编码零个非插入,然后插入 .

这就是将位置编码到基本字符串中的方式。