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字符组成,则按原样复制
- 否则:
- 首先我们输出
,后跟所有ASCII字符(跳过非ASCII字符)xn--
- 然后,如果最后一个字符不是
,我们将输出-
,以将ASCII与非ASCII分开-
- 最后,我们使用punycode对每个非ASCII字符进行编码,使它们看起来像ASCII字符
- 首先我们输出
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,你的链接让我做了更多的调查,结果证明你是对的。已经添加了调查的内容来充实你的答案,希望你不介意。