[1] [[IDNA]] の [DFN@en[[CODE@en[ToUnicode]]]] は、[[国際化ラベル]]を[[ACEラベル]]ではない[[国際化ラベル]]に変換する[[演算]]です。 * 仕様書 - [2] [CITE@en[RFC 3490 - Internationalizing Domain Names in Applications (IDNA)]] ([[IETF]] [[提案標準]]) -- [CSECTION@en[4.2 ToUnicode]] - [22] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]] ([TIME[2010-10-30 01:01:25 +09:00]] 版) -- [17] -- [23] * 入力 - [3] [[国際化名札]]、すなわち [[Unicode]] [[符号位置]]の列。 [SRC@en[RFC 3490 4.2]] - [9] [[フラグ]] [CODE@en[[[AllowUnassigned]]]]。 [SRC@en[RFC 3490 4.2]] - [10] [[フラグ]] [CODE@en[[[UseSTD3ASCIIRules]]]]。 [SRC@en[RFC 3490 4.2]] [11] [[ToASCII]] を内部的に呼び出すので、 >>10 が入力となっています。直接は使っていません。 * 出力 - [4] [[国際化名札]]、すなわち [[Unicode]] [[符号位置]]の列。 [SRC@en[RFC 3490 4.2]] -- [12] [[入力]]が [[ACE名札]]なら、 [[等価]]で[[ACE名札]]では''ない''[[国際化名札]]。 -- [13] そうでなければ、元のままの[[国際化名札]]。 [5] [CODE@en[[[ToUnicode]]]] は[[失敗]]しません。 >>8 の[[算法]]が[[失敗]]した場合、 [[入力]]をそのまま[[出力]]とします。 [SRC@en[RFC 3490 4.2]] * 算法 [8] = すべての[[符号位置]]が [[ASCII]] の範囲 ([CODE(char)[[[U+0000]]]]〜[CODE(char)[[[U+007F]]]]) に収まっていれば、 3 に進みます。 = [[Nameprep]] を適用します ([[旗]] [CODE@en[[[AllowUnassigned]]]] を使用します)。 [[誤り]]があれば[[失敗]]とします。 = [[ACE接頭辞]]ではじまることを確認し、 [[符号位置]]の列の複製を作ります。 = [[ACE接頭辞]]を削除します。 = [[Punycode]] を[[復号]]します。 [[誤り]]があれば[[失敗]]とします。 結果の列の複製を作ります。 = [CODE@en[[[ToASCII]]]] を適用します。 = 6 の結果が 3 で作成した複製と[[一致]]することを確認します。 ここで、[[一致]]するかは [[ASCII]] の[[大文字]]・[[小文字]]を区別しない[[比較]]によります。 = 5 で作成した複製を出力とします。 [15] 確認して違っていたらどうするのでしょう。[[失敗]]とすることを想定しているように見えますが、 明記されていません。 [16] 失敗した場合、 >>5 によりもとの入力が [[ToUnicode]] の結果となります。 * 性質 -[7] [[出力]]が[[入力]]より[[符号位置]]が増えることはありません。 [SRC@en[RFC 3490 4.2]] * UTS #46 ToUnicode 演算 [18] [[UTS #46]] の [[ToUnicode]] [[演算]]は、[[ラベル]]ではなく[[ドメイン名]]全体に対して定義されています。 [19] [[UTS #46]] の [[ToUnicode]] [[演算]]は、[[入力]]である[[文字列]]に対して[[非移行的処理]]を適用するというものです [SRC[>>17]]。 [[誤り]]があるかもしれませんが、常に結果として[[文字列]]を[[出力]]します [SRC[>>17]]。 * UTS #46 IDNA2008 前処理 [20] [[UTS #46]] の[DFN[[RUBYB[[[IDNA2008前処理]]]@en[Preprocessing for IDNA2008]]]]は、 [WEAK[(完全な [[Unicode IDNA互換性処理]]を行うのとは違って)]] [[IDNA2008]] の規定する処理に対する[[前処理]]として使うことができる[[算法]]であり、 その[[適合性]]の[[クラス]]です。 [21] [[IDNA2008前処理]]とは、[[入力]]となる[[文字列]]に [[ToUnicode]] [[演算]] (>>19) を適用することと定義されています [SRC[>>23]]。 ;; [24] [[IDNA2008前処理]]を適用すると[[大文字]]から[[小文字]]への変換など [[IDNA2003]]では行われていた処理の一部がなされるようになります。 これだけでは [[IDNA2008]] で認められていない[[文字]]が一部素通しされてしまいますが、 「前」処理であるので問題にはなりません [SRC[>>23]]。 * 関連 [14] 逆の操作として、 [[ToASCII]] [[演算]]があります。