【问题标题】:java IDN functions not reversible?java IDN 函数不可逆?
【发布时间】:2017-04-25 22:57:54
【问题描述】:

为什么有些 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

如你所见,第二个字符被分割了!

谢谢

【问题讨论】:

    标签: java idn


    【解决方案1】:

    这是设计使然。据我所知,字符串中的第二个字符是 \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 中使用它是个坏主意!)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        • 2012-04-23
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多