0

为什么有些 IDN 不可逆:

String domain = "aʼnċăwb7rňuħ.eu";
System.out.println(domain);
domain = IDN.toASCII(domain);
System.out.println(domain);
domain = IDN.toUnicode(domain);
System.out.println(domain);

它显示:

aʼnċăwb7rňuħ.eu
xn--anwb7ru-93a5e8ozmq2m.eu
aʼnċăwb7rňuħ.eu

如您所见,第二个字符已被拆分!

谢谢

4

2 回答 2

2

这是设计使然。据我所知,字符串中的第二个字符是 \u0149 代码点。根据最新的 Unicode 码表:

此字符已被弃用,强烈建议不要使用它

Unicode 代码表表示不推荐使用的代码点相当于\u02bc后跟\u006e.

根据 javadocs,第一步IDN.toASCII(String)是使用 RFC 3491 stringprep / nameprep 算法来处理输入字符串中的字符。RFC 摘要说:

本文档描述了如何准备国际化域名 (IDN) 标签,以增加名称输入和名称比较以对全世界典型用户有意义的方式工作的可能性。stringprep 协议的此配置文件用作用于国际化域名系统 (DNS) 的在线协议套件的一部分。

(换句话说,stringprep 旨在让创建看起来像一回事但含义不同的棘手域名变得更加困难。)

事实上,如果你深入研究,你会发现 stringprep 表中规定的映射\u0149\u02bc \u006e; 即 Unicode 代码图表中定义的等效项。

而且......这就是正在发生的事情。


概括

  1. 您期望可以往返 IDN 是没有根据的。
  2. 无论如何,您都不应该使用该字符,因为它已被弃用。(当然,在 IDN 中使用它是个坏主意!)
于 2017-04-25T14:00:23.820 回答
0

IDN toASCII 过程本质上是不可逆的,因为它涉及执行 Unicode 规范化(以形成 NFKC)作为过程的一部分。通常,多个 Unicode 字符序列可以具有相同的规范化形式;IDN toUnicode 过程将从 ACE 标签生成其中一种形式,但不能保证它与最初编码的形式相同。

如果结果toUnicode(toASCII(x))不同,x那么两者对于 IDN 的目的仍然是等价的,而且它们还应该是彼此的 Unicode 兼容性等价物。一般来说,它们会被 Unicode 字体类似地渲染。从这个意义上说,您的情况存在明显差异有点令人惊讶,但最重要的是,您对可逆性的明显期望是没有根据的。

于 2017-04-25T13:56:30.617 回答