punycode如何区分相似的虹膜?

punycode如何区分相似的虹膜?,punycode,iri,Punycode,Iri,我一直在研究国际化的资源标识符,有一件事困扰着我 我的理解是,对于域名中的每个标签(xyzy.plugh.com有三个标签,xyzy、plugh和com),执行以下过程将其转换为ASCII表示,以便所有遗留软件都可以正常处理: 如果它仅由ASCII字符组成,则按原样复制 否则: 首先我们输出xn--,后跟所有ASCII字符(跳过非ASCII字符) 然后,如果最后一个字符不是-,我们将输出-,以将ASCII与非ASCII分开 最后,我们使用punycode对每个非ASCII字符进行编码,使它们

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

我的理解是,对于域名中的每个标签(
xyzy.plugh.com
有三个标签,
xyzy
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/
仅仅是因为整个标签的序列信息丢失了

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

根据,有不同的编码:

aa☃.net -> xn--aa-gsx.net
☃aa.net -> xn--aa-esx.net
                  ^
                  see here
这是为什么的细节。首先,它在导言中提供了线索:

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

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

这意味着每个基本/扩展字符串对都必须有可微的一对一映射

理解它如何区分这两种可能性需要理解解码器(将基本字符串转换回扩展字符串的东西,以及它所有的Unicode功能)的工作原理

解码器首先从基本字符串
aa.net
开始,指针指向第一个
a
,然后应用一系列增量,如
gsx
esx

delta实际上编码了两件事。第一个是要执行的非插入次数,第二个是实际插入次数

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


这就是位置被编码成基本字符串的方式。

brunesto,你的链接让我做了更多的调查,结果证明你是对的。已经添加了调查的内容来充实你的答案,希望你不介意。