[3] [DFN[Unicode IDNA Compatibility Processing]] ([DFN[Unicode IDNA 互換性処理]]) は、 [[IDNA2003]] との互換性を保持しつつも [[IDNA2008]] と整合性のある処理を行う方法 (を定めた仕様書) です。 [[IDNA2008]] は [[IDNA2003]] から極めて非互換に変更が加えられており、 単純に置き換えるだけでは既存の実装や[[文書]]との互換性を喪失してしまいますが、 Unicode IDNA 互換性処理は [[IDNA2003]] と [[IDNA2008]] を組み合わせたような仕様となっており、それによって互換性を保ちつつ [[IDNA2008]] へと移行してゆけるようになっています。 * 仕様書 - [2] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]] ([TIME[2010-10-30 01:01:25 +09:00]] 版) - [1] [CITE@en-us[FAQ - International Domain Names (IDN)]] ( ([TIME[2010-10-14 08:53:42 +09:00]] 版)) * Unicode IDNA 互換性処理 ** 入力 [8] [[Unicode IDNA互換性処理]]への[[入力]]は、 - [9] [[ドメイン名]]とみられる [[Unicode]] [[文字列]] [VAR@en[domain_name]] - [10] [[移行的処理]]または[[非移行的処理]]のいずれであるか ... です [SRC[>>2 4.]]。 ** 出力 [11] [[Unicode IDNA互換性処理]]の[[出力]]は、 - [12] [[Unicode]] [[文字列]] [VAR@en[domain_name]] - [13] [[誤り]]があったか否かの[[フラグ]] ... です。[[誤り]]が途中で発生していたとしても、可能なかぎりの処理がなされています。 [SRC[>>2 4.]] ** 手続き [34] この[[算法]]では次のような処理を行います。 [SRC[>>2 4.]] = [14] [RUBYB[[[写像]]]@en[map]]: [VAR@en[domain_name]] 中の各[[符号位置]]について、 == [15] [[IDNA写像表]]における[[状態値]]が、 ==- [16] [[禁止]]なら、その[[符号位置]]はそのままとし、[[誤り]]を記録します。 ==- [17] [[無視]]なら、その[[符号位置]]を削除します。 ==- [18] [[写像]]なら、その[[符号位置]]を[[IDNA写像表]]における[[写像値]]に置き換えます。 ==- [19] [[偏差]]なら、 ==-- [20] [[移行的処理]]においては、その[[符号位置]]を[[IDNA写像表]]における[[写像値]]に置き換えます。 ==-- [21] [[非移行的処理]]においては、その[[符号位置]]はそのままとします。 ==- [22] [[妥当]]なら、その[[符号位置]]はそのままとします。 = [23] [RUBYB[[[正規化]]]@en[normalize]]: [VAR@en[domain_name]] を [[NFC]] で[[正規化]]します。 = [24] [RUBYB[[[切断]]]@en[break]]: [VAR@en[domain_name]] を [CODE(charname)@en[[[FULL STOP]]]] で[[切断]]して[[ラベル]]の並びとします。 = [25] [RUBYB[[[変換]]・[[妥当性検証]]]@en[convert/validate]]: [VAR@en[domain_name]] 中の各[[ラベル]]について、 == [26] [[ラベル]]が [CODE[[[xn--]]]] から始まる場合、 === [27] [[ラベル]]の残りの部分を [[Punycode]] により[[復号]]して [[Unicode]] に変換しようと試みます。 ==== [28] 変換に[[失敗]]した場合は、[[誤り]]を記録し、次の[[ラベル]]へと進みます。 ==== [29] そうでなければ、元の[[ラベル]]を変換結果により置き換えます。 === [30] [[ラベル]]の妥当性を[[非移行的処理]]用の方法で検証します。 ([[ラベル]]の項を参照。) 妥当性の制約を満たさない場合は、[[誤り]]を記録します。 == [31] [[ラベル]]が [CODE[[[xn--]] から始まらない場合、 ==- [32] [[ラベル]]の妥当性を、[[入力]]で指定 (>>10) された方法で検証します。 ([[ラベル]]の項を参照。) 妥当性の制約を満たさない場合は、[[誤り]]を記録します。 [33] [[誤り]]が記録されていなければ [VAR@en[domain_name]] の処理は[[成功]]であり、 記録されていれば[[失敗]]です。 [SRC[>>2 4.]] ** 性質 [35] この[[算法]]は[[冪等]]です。 [SRC[>>2 4.]] [37] [[移行的処理]]、[[非移行的処理]]のどちらであっても、元々 [[Punycode]] 化されていれば、それは変更されずに出力されます。ですから、 [[IDNA写像表]]の[[状態値]]が[[偏差]]の[[文字]]はそのままでは[[移行的処理]]か[[非移行的処理]]かによって結果が変わってしまいますが、 [[Punycode]] 化した[[Aラベル]]であれば回避できます。 [SRC[>>2 4.]] ** メモ [36] [[利用者]]に[[ドメイン名]]を提示する時には更に変更を加えても構いません。 禁止されている[[文字]]を [CODE(char)[[[U+FFFD]]]] に置き換えたり、 [[妥当性検証]]で失敗した[[ラベル]]を [CODE(char)[[[U+FFFD]]]] その他の表示により[[利用者]]に示したりするのがよいとされています。 [SRC[>>2 4.]] * XXX [4] [[Unicode IDNA互換性処理]]には次の3種類の[[算法]]・[[適合性]]が規定されています。 - [5] [DFN[[RUBYB[[[移行的処理]]]@en[Transitional Processing]]]] - [6] [DFN[[RUBYB[[[非移行的処理]]]@en[Nontransitional Processing]]]] - [7] [DFN[[RUBYB[[[IDNA2008前処理]]]@en[Preprocessing for IDNA2008]]]] - 2. - 4.4.