punycode如何区分类似的IRI?

时间:2015-06-11 02:30:31

标签: punycode iri

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

我的理解是,对于域名中的每个标签(xyzzy.plugh.com都有三个标签xyzzyplughcom),执行以下过程:将其转换为ASCII表示形式,以便所有传统软件都可以正常处理它:

  • 如果它仅由ASCII字符组成,则按原样复制。
  • 否则:
    • 首先我们输出xn--后跟所有ASCII字符(跳过非ASCII)。
    • 然后,如果最终字符不是-,我们输出-将ASCII与非ASCII分开。
    • 最后,我们使用punycode对每个非ASCII字符进行编码,使它们看起来像是ASCII。

我的问题是:我们如何区分以下两个Unicode URI?

http://aa☃.net/
http://☃aa.net/

在我看来,这两个将编码为:

http://xn--aa-nfh.net/

仅仅是因为整个标签的测序信息已经丢失。

或者我在规范中遗漏了什么?

1 个答案:

答案 0 :(得分:2)

根据one punycode encoder,编码方式不同:

aa☃.net -> xn--aa-gsx.net
☃aa.net -> xn--aa-esx.net
                  ^
                  see here

relevant RFC 3492详细说明了为什么会这样。首先,它提供了引言中的线索:

  

唯一性:最多只有一个基本字符串代表给定的扩展字符串。

     

可逆性:可以从该基本字符串中恢复映射到基本字符串的任何扩展字符串。

这意味着每个基本/扩展字符串对必须存在可区分的一对一映射。

理解它如何区分这两种可能性需要理解解码器(将基本字符串转换为扩展的解码器,并具有所有Unicode荣耀)。

解码器从仅使用指向第一个aa.net的指针的基本字符串a开始,然后应用一系列增量,例如gsxesx

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

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

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