我一直在研究国际化资源标识符,但有一件事困扰着我。
我的理解是,对于域名中的每个标签(xyzzy.plugh.com
都有三个标签xyzzy
,plugh
和com
),执行以下过程:将其转换为ASCII表示形式,以便所有传统软件都可以正常处理它:
xn--
后跟所有ASCII字符(跳过非ASCII)。-
,我们输出-
将ASCII与非ASCII分开。我的问题是:我们如何区分以下两个Unicode URI?
http://aa☃.net/
http://☃aa.net/
在我看来,这两个将编码为:
http://xn--aa-nfh.net/
仅仅是因为整个标签的测序信息已经丢失。
或者我在规范中遗漏了什么?
答案 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
开始,然后应用一系列增量,例如gsx
或esx
delta实际上编码了两个的东西。第一个是要完成的非插入次数,第二个是实际插入次数。
因此,gsx
(aa☃.net
中的增量)会编码两个非插入(跳过aa
),然后插入☃
。 esx
delta(对于☃aa.net
)将编码零非插入,然后插入☃
。
这就是将位置编码到基本字符串中的方式。