2017-04-25 4 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番目の文字は分割されました!それはプロセスの一部として(NFKCを形成する)Unicode正規化を行うことを含むよう

おかげ

答えて

2

これは仕様です。私が知ることから、文字列の2番目の文字は\ u0149コードポイントです。最新のUnicodeコードチャートによると:

この文字は非推奨となり、その使用されること が強く

を推奨されたUnicodeコードチャートは、非推奨のコードポイントが\u006e続い\u02bcと等価であることを述べています。

IDN.toASCII(String)が行うjavadocsの最初のステップでは、RFC 3491 stringprep/nameprepアルゴリズムを使用して入力文字列の文字を処理します。 RFCの抽象は言う:

この文書では、可能性を高めるために、国際化ドメイン名 (IDN)のラベルを準備する方法について説明し、その全体の典型的なユーザー ために意味をなす方法で、名前の入力と 名比較作業世界。 stringprepプロトコルのこのプロファイルは、 ドメインネームシステム(DNS)を国際化するためのオンザフライプロトコルの一部として使用される です。

(つまり、文字列前はそれが難しく、一つのことのように見えると異なる何かを意味トリッキーなドメイン名を作成するように設計されている。)実際に

、あなたがドリルダウンした場合、あなたがいることがわかります\u0149のstringprepテーブル内の規定されたマッピングは\u02bc\u006eです。つまり、Unicodeコードチャートで定義されている同等のものです。

...それは起こっていることです。


概要

  1. のIDNが悪い設立であることができます往復あなたの期待。
  2. これは推奨されていないので、とにかくその文字を使用するべきではありません。 (確かにIDNで使用するのは悪い考えです!)
0

IDNもしToASCII手順は、本質非可逆的です。一般に、複数のUnicode文字シーケンスは同じ正規化された形式を持つことができます。 IDN toUnicodeプロシージャは、ACEラベルからのフォームを生成しますが、元々エンコードされたものと同じであるという保証はありません。

toUnicode(toASCII(x))の結果がxと異なる場合でも、2つのIDNはIDNの目的と同等であり、さらにそれらは互いに同等のUnicode互換性を持つ必要があります。一般的に言えば、それらは同様にUnicodeフォントでレンダリングされます。その意味では、あなたのケースに顕著な違いがあることはちょっと驚くべきことですが、最終的な見通しは、可逆性のあなたの明らかな期待は根拠がないということです。

関連する問題