[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.