2017-04-25 26 views
0

爲什麼會出現一些IDN不可逆的:java 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 

正如你所看到的,第二個字符已經分裂!

由於

回答

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. 你的期望,你可以往返國際化域名被不攻自破。
  2. 無論如何,您不應該使用該字符,因爲它已被棄用。 (當然,在IDN中使用它是一個壞主意!)
0

的IDN toascii將過程是固有不可逆的,因爲它涉及執行的Unicode正常化(以形成NFKC)作爲過程的一部分。通常,多個Unicode字符序列可以具有相同的標準化形式; IDN toUnicode程序將從ACE標籤生成這些表單的一個,但不能保證它與最初編碼的是相同的。

如果toUnicode(toASCII(x))的結果確實與x不同,那麼這兩者仍然等同於IDN的目的,並且它們還應該是相互的Unicode兼容性等價物。一般來說,它們將通過Unicode字體進行類似的渲染。從這個意義上說,你的情況有一個明顯的差異,這有點令人驚訝,但底線是你對可逆性的明顯期望是沒有根據的。