[10] [[LDHラベル]]を拡張して[[非ASCII文字]]を利用できるようにしたものを、
[DFN[[RUBYB[国際化ラベル]@en[internationalized label]]]]といいます。

* 仕様書

- [6] [[IDNA2003]] [CITE@en[RFC 3490 - Internationalizing Domain Names in Applications (IDNA)]] 
-- [3] '''<http://tools.ietf.org/html/rfc3490#section-2>'''
-- [7] <http://tools.ietf.org/html/rfc3490#section-6.3>
- [11] [[IDNA2008]]
-- [28]  [CITE@en[RFC 5890 - Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework]]
--- [12] '''<http://tools.ietf.org/html/rfc5890#page-14>'''
--- [15] <http://tools.ietf.org/html/rfc5890#section-2.3.2.4>
--- [25] <http://tools.ietf.org/html/rfc5890#section-2.3.3>
-- [27] [CITE@en[RFC 5891 - Internationalized Domain Names in Applications (IDNA): Protocol]] 
--- [29] <http://tools.ietf.org/html/rfc5891#section-3.1>
--- [41] <http://tools.ietf.org/html/rfc5891#section-4>
-- [117] [CITE@en[RFC 5894 - Internationalized Domain Names for Applications (IDNA): Background, Explanation, and Rationale]] 
--- [108] <http://tools.ietf.org/html/rfc5894#section-3.2>
--- [118] <http://tools.ietf.org/html/rfc5894#section-7.1.3>

* 定義

** IDNA2003 の定義

[1]
>
[DFN[[RUBY[国際化][こくさいか]@en[internationalized]][RUBYB[ラベル]@en[label]]]]は、
[CODE@en[[[ToASCII]]]] [[操作]]
[WEAK[([[フラグ]] [CODE@en[[[UseSTD3ASCIIRules]]]] は未設定)]]
が[[失敗]]しないような[[ラベル]]です。
[[STD 13]] の長さ制限を満たす[[各ASCIIラベル]]は[[国際化ラベル]]です。
従って[Q[[[国際化ラベル]]]]は従来の [[ASCIIラベル]]と新しい[[非ASCIIラベル]]の両方を含む一般化した[[用語]]です。
ほとんどの [[Unicode]] [[文字]]が[[国際化ラベル]]中に現れることができますが、
入力文字列によっては [CODE@en[[[ToASCII]]]]
が[[失敗]]することがあり、そのような[[文字列]]は[[妥当]]な[[国際化ラベル]]ではありません。
[SRC[>>3]]

** IDNA2008 の定義

[13] [[IDN]] の1つの[[ラベル]]、すなわち[[Aラベル]]、[[Uラベル]]、[[NR-LDHラベル]]のいずれかである[[ラベル]]を[DFN[[RUBYB[国際化ラベル]@en[internationalized label]]]]といいます。
[[下線ラベル]]などは[[国際化ラベル]]ではありません。
[SRC[>>12]]

** メモ

[14] [[IDNA2003]] では[[LDHラベル]]の条件を満たさなくても[[テキスト・ラベル]]であれば[[国際化ラベル]]に含まれましたが、
[[IDNA2008]] では [[LDHラベル]]と [[Uラベル]]だけが[[国際化ラベル]]です。
[[ToASCII]]が失敗しない[[非ASCII]]
[[文字列]]の[[集合]]と[[Uラベル]]である[[文字列]]の[[集合]]も異なっています。

* 文字の順序

[26] [[ラベル]]における[[文字]]の順序は、[[表示順]]ではなく[[論理順]]です [SRC[>>25]]。

;; [115] [[ラベル]]を含んだ[[ドメイン名]]全体については、[[ドメイン名]]の項を参照してください。

* 比較

[16] [[IDNA2003]] も [[IDNA2008]] も、 [[ASCII]] による ([[Punycode]] による)
表現に変換した上で[[ASCII大文字・小文字不区別]]で[[一致]]するかどうかを[[等価]]であることの定義としています。

[23] 両者とも表面的には同じ定義になっていますが、実際には [[IDNA2003]] の [[ToASCII]] [[演算]]と
[[IDNA2008]] の[[Aラベル]]への変換が大きく異なっているので、[[等価性]]の定義も実は大きく異なっています。

** IDNA2003 における等価性の定義

[2] [SRC[>>3]]
> [[IDNA]] では、[[ラベル]]の[[等価性]]はそれが [[ASCIIラベル]]であるか否かに関わらず、
[CODE@en[[[ToASCII]]]] [[演算]]によって [[ASCII]] 形を構築した上で定義されます。
[[ラベル]]は、 [CODE@en[[[ToASCII]]]] によって生成した [[ASCII]] 形が[[大文字・小文字不区別]]の
[[ASCII]] [[比較]]により[[一致]]する場合、その場合に限って、
[RUBY[[[等価]]][とうか]@en[equivalent]]であるとします。
[[ASCIIラベル]]に対しては[[大文字]]と[[小文字]]は[[等価]]とみなすという[[等価性]]が既に存在します。
[[IDNA]] での[[等価性]]はこの従来の[[等価性]]の拡張になります。
[CODE(example)@en[foo]] と [CODE(example)@en[Foo]]
が同じ[[ラベル]]の別の形であるのと同様に、
[[IDNA]] において[[等価]]な[[ラベル]]は同じ[[ラベル]]の別の形であるものとして取り扱います。

** IDNA2008 における等価性の定義

[30] [[IDNA2008]] の2つの[[ラベル]]が[DFN[[RUBYB[等価]@en[equivalent]]]]であるとは、
- [34] 両方を[[Uラベル]]として表したときに完全に等しい
- [35] 両方を[[Aラベル]]として表したときに[[ASCII大文字・小文字不区別]]で等しい

... のいずれかであることをいいます [SRC[>>15, >>29]]。

[36] [[Uラベル]]と[[Aラベル]]は互いに情報の損失なく変換できるので、
[[Uラベル]]としての比較と [[Aラベル]]としての比較は必ず同じ結果になります [SRC[>>29]]。

[37] [[Aラベル]]は [[LDHラベル]]であり、従来の [[DNS]] の規定に基づく[[等価性]]の定義、
つまり [[ASCII大文字・小文字不区別]]の比較が適用されますが、
[[Uラベル]]にはこれが適用されず、そのまま比較することとなっています。 [SRC[>>15, >>29]]
[[正規化]]なども行われません。

;; [39] [[NR-LDHラベル]]は従来通りの [[DNS]] の [[ASCII大文字・小文字不区別]]の一致により等しいかが決まります。

[38] [[Uラベル]]も[[Aラベル]]も、妥当性の検証は比較のために必須ではありません [SRC[>>29]]。
(つまり[[未検証Uラベル]]同士や[[未検証Aラベル]]同士で比較できます。)
しかし[[妥当性検証]]は諸々の理由でどのみち重要であって行う[['''べき''']]である
[SRC[>>29]] とされています。

* DNS 鯖における取り扱い (IDNA2003)

[8] [[ゾーン]]に蓄積される[[ドメイン名]]は、 [[Stringprep]] における[[蓄積文字列]]の規則に従います。
[SRC[>>7]]

[9] [[DNS鯖]]は、 [[ASCII]] で表現できない[[国際化ラベル]]は、 [[ToASCII]]
[[演算]]を適用し、 [[ACE]] 形を使って表現しなければ[['''なりません''']]。
[SRC[>>7]]

* 国際化ドメイン名登録プロトコル

[46] [[非ASCII文字]]を含む[[国際化ラベル]]の[[登録]]にあたっては、
[[IDNA2008]] によれば次の手順に従うこととされています。

** 登録の受付

[40] [[レジストラ]]を経て[[レジストリー]]に至る登録手続きについては [[IDNA]]
では適用範囲外とされており、[[レジストリー]] ([[ゾーン管理者]])
による登録のみが規定されています。登録手続きの段階で個別の事情に応じて変換などが行われるかもしれませんが、
[[IDNA]] 仕様による制約の及ばない範囲とされています。[[レジストリー]] ([[ゾーン・ファイル]]に責任をもつ者)
は、 (そうした手続きの後の) 実際に登録を行うべき文字列そのものだけを受け付けなければ[['''なりません''']]。
登録する[[文字列]]は [[Unicode]] で、 [[NFC]] でなければ[['''なりません''']]。 [SRC[>>41 4.1]]

[42] [[レジストリー]]は、次の3つのいずれの形式の入力であっても受け付けて[['''構いません''']]が、
[[Aラベル]]によって曖昧性を回避できるため、 >>43 と >>44 が[['''推奨''']]されています。
更に、検証が可能という点において >>44 より >>43 が通常[RUBYB[好ましい]@en[preferred]]とされています。
[SRC[>>41 4.1]]

- [43] [[Aラベル]]と[[Uラベル]]の組
- [44] [[Aラベル]]だけ
- [45] [[Uラベル]]だけ

[111] >>40 の要件 ([[Aラベル]]と[[Uラベル]]を受け付け、それ以外は受け付けてはいけないとするもの) は、
[RUBYB[登録者]@en[registrant]]が何を登録しようとしているか理解することを要求するとともに、
これら[[正準形]]の利用を促進することが目的である、とされています [SRC[>>108]]。

;; [112] [[Uラベル]]や[[Aラベル]]でないものを受け付けるということは、例えば [[NFC]]
になっていない[[文字]]が含まれる[[ラベル]]の[[登録]]を受け付けるということになりますが、
これは望ましくなく、実際に技術的に利用可能である正規化済みの[[ラベル]]を登録者が理解した上で[[登録]]手続きがなされるべき、ということでしょう。

;; [113] もっとも、これが特定の[[符号]]列によって[[登録者]]と[[レジストリー]]がやりとりを行うことを強制するものではないとされています [SRC[>>108]]。
極端な話、紙で申請されていても、それがプロトコル上の意味での[[登録]]が始まる時点までに[[Uラベル]]や[[Aラベル]]に曖昧無く変換されているのであれば、この要件の趣旨は達成できているということでしょうね。

** 入力のチェック

[121] 与えられたのが[[Uラベル]]であるか[[Aラベル]]であるかに応じて、次のチェックを行います。

*** UラベルとAラベルが与えられた場合のチェック

[47] [[Uラベル]]と[[Aラベル]]の両方が与えられた場合、
- [52] [[Aラベル]]について、
-= [48] [[小文字]]化し、
-= [49] [[Aラベル]]を[[Uラベル]]に変換し、
-= [50] [[Uラベル]]に対する手順を実行し、
-= [51] [[Aラベル]]に変換 ([[RFC 5891]] 4.4) し、
-= [53] 元の[[Aラベル]]と[[一致]]するか確認しなければ[['''なりません''']]。 [SRC[>>41 4.2]]
- [54] [[Uラベル]]について、
-= [55] >>49 と[[一致]]するか確認しなければ[['''なりません''']]。 [SRC[>>41 4.2]]
- [56] >>52、>>54 で[[一致]]しない場合は[[登録]]を拒絶しなければ[['''なりません''']]。 [SRC[>>41 4.2]]

*** Aラベルだけが与えられた場合のチェック

[57] [[Aラベル]]だけが与えられた場合で [[Uラベル]]への変換を行わない場合、
- [58] [[Aラベル]]が表面的に[[妥当]]であるか
[WEAK[([[Punycode]] 違反、例えば末尾が [CODE(char)[[[-]]]] でないか、すべてが[[ASCII文字]]であるか、など)]]
を確認しなければ[['''なりません''']]。 [SRC[>>41 4.2]]
- [59] [[Aラベル]]に見える文字列 ([CODE[[[xn--]]]] で始まるなど) であったり、
[[Aラベル]]を与えるべきところで与えられた文字列であったりするものが >>58
でいうところの[[妥当]]な [[Aラベル]]でなければ、これを [[IDNA]]
に対応した [[DNSゾーン]]に配置しては[['''なりません''']]。 [SRC[>>41 4.2]]
- [60] 登録手続きにおいては、以後のチェックを飛ばして[['''構いません''']]し、通常はそうします。
[SRC[>>41 4.2]]

;; [120] [[Uラベル]]はきちんとチェックさせておきながら[[Aラベル]]でこうやって抜け道を残す意図はなんでしょうかね。

*** Uラベルだけが与えられた場合のチェック

[61] [[Uラベル]]だけが与えられた場合に特に行うチェックは規定されていません。

** 文字のチェック

[64] 与えられた [[Unicode]] [[文字列]]に対して次のチェックを行います。
ここで使う[[文字]]の順序は[[ネットワーク順]]であって、
[[表示順]]であっては[RUBYB[いけません]@en[may not]]。 [SRC[>>41 4.2.3]]

;; [66] [[Aラベル]]だけが与えられた場合は通常このチェックを飛ばします (>>60)。

- [65] 3文字目と4文字目が [CODE[[[--]]]] であっては[['''なりません''']]。 [SRC[>>41 4.2.3.1]]
- [67] 最初や最後が [CODE(char)[[[-]]]] であっては[['''なりません''']]。 [SRC[>>41 4.2.3.1]]
- [68] 最初の[[文字]]が[[結合文字]] ([[Unicode]] の2.11節) であってはなりません。 [SRC[>>41 4.2.3.2]]
- [62] [[導出特性値]]が [[DISALLOWED]] や [[UNASSIGNED]] の[[符号位置]]を含んでは[['''なりません''']]。 
[SRC[>>41 4.2.2]]
- [69] [[導出特性値]]が [[CONTEXT]] な[[符号位置]]については[[文脈的規則]]によってチェックします。
-- [70] [[文脈的規則]]を持たない ([[null規則]]を持つ) 場合、その[[符号位置]]は含まれては[['''なりません''']]。
[[ラベル]]は非妥当です。 [SRC[>>41 4.2.3.3]]
-- [71] [[文脈的規則]]を持っており、その結果が[[偽]]または[[未定義]]なら、その[[符号位置]]は含まれては[['''なりません''']]。
[[ラベル]]は非妥当です。 [SRC[>>41 4.2.3.3]]
-- [72] [[文脈的規則]]を持っており、その結果が[[真]]なら、その[[符号位置]]は含まれて構いません。
- [73] [[rtl]] な[[文字]]を含むときは、[[bidi規則]]に従わなければ[['''なりません''']]。 [SRC[>>41 4.2.3.4]]

** ラベルの長さチェック

[74] [[Uラベル]]であるためには、[[非ASCII文字]]を1文字以上含んでいなければならず、
[[ACE形]] [WEAK[([[Punycode]] で[[符号化]]して最初に [CODE[[[xn--]]]] をつけたもの [SRC[>>41 4.4]])]]
にした状態で63文字[[以下]]でなければなりません。 [SRC[>>41 4.2.4]]

** レジストリーでの制約

[75] 以上の構文的な制約に加えて、[[レジストリー]]は個々の事情に応じて必要な制約を課し、
それを満たさない[[ラベル]]を拒否して構いません。 [SRC[>>41 4.3]]

[109] [[IDNA2008]] は[[レジストリー]]の方針を定義することもできないし定義するべきではないとしつつも、
各[[レジストリー]]は混乱を避けるなどの必要に応じて制約を設けるべきであるとしています。
特に、一般に複数の[[用字系]]の[[文字]]を含む[[ラベル]]は好ましくないと考えられているとしています。
[SRC[>>108]]

;; [110] そのような[[レジストリー]]の制約で用いられる技法の具体例として、
[[JET仕様書]] ([[RFC 3743]]、[[RFC 4290]]) や[[中国語]]における [[RFC 4713]]
が挙げられています [SRC[>>108]]。

[114] [CODE(charname)@en[[[LATIN SMALL LIGATURE AE]]]] と [[ae]] に関係する各種の[[文字]]のように、
2文字の列と1文字が[[言語]]によっては等価とみなされることがあります。
そのような[[言語]]を扱う[[レジストリー]]では、 [[JET仕様書]]でいう [[variant]]
モデルを採用するか、どちらかの表現での[[登録]]を認めないなどの措置を検討するべきです。
[SRC[>>108 4.3.]]

[119] [[IANA]] は各 [[TLD]] での方針を集めた [CITE@en[[[Repository of IDN Practices]]]]
を管理しています。

** Punycode で符号化

[78] [[Uラベル]]を [[Punycode]] で[[符号化]]し、最初に [CODE[[[xn--]]]] をつけて
[[Aラベル]]を得ます。 [SRC[>>41 4.4]]

[76] [[Punycode]] の[[符号化]]の[[算法]]は失敗することがありますが、
この手順でのチェックを終えた[[Uラベル]]については、文字列の最大長についてのものを除き、
失敗することがありません。 [SRC[>>41 4.4]]

** 登録

[77] こうして[[ラベル]]がチェックを通過したなら、
[[DNS]] には[[Aラベル]]を登録します。 [SRC[>>41 4.5]]

* ドメイン名 lookup プロトコル

[79] [[ドメイン名]]の [[lookup]] にあたっては、 [[IDNA2008]] によれば次の手順で処理することとなっています。

[80] この手順は[[登録]]よりはチェックが緩くなっていますが、これは [[DNS]]
に登録されている[[名前]]はチェック済みであり、 [[lookup]] はそれとの一致を確認するに過ぎないことによります。
とはいえ、[[ワイルドカード]]のような仕組みがあるため、まったくチェックをしないわけにもいきません。
[SRC[>>41 5.]]

** ラベルの入力

[81] まずは、[[利用者]]が直接入力した [[URL]] から取り出す、[[クリック]]して選択する、
[[ファイル]]に保存されている[[文字列]]から取り出すなどの形で[[ドメイン名]]を[[入力]]として得ます。
[SRC[>>41 5.1]]

[82] この[[文字列]]が元々どんな[[文字コード]]で表されていたにせよ、 [[Unicode]]
に変換します。
[SRC[>>41 5.2]]

[83] 必要に応じて、純粋な[[文字コード]]の変換だけではなく、
[[文字]]から[[文字]]への[[写像]]を適用しても構いません。
[SRC[>>41 5.2]]

[84] 最終的に入力となる[[文字列]]は [[NFC]] としなければ[['''なりません''']]。
[SRC[>>41 5.2]]

** Aラベルの場合

[85] さて、入力に[[未検証Aラベル]]がある場合、
全体を[[小文字]]に変換し、チェックを行った上で[[Uラベル]]に変換して[['''構いません''']]。
ここで [[Punycode]] の[[復号]]の[[算法]]によって [[Uラベル]]に変換される場合には、
指定された手順に従わ[['''なければならず''']]、その結果得られた[[ラベル]]が元の[[Aラベル]]と同じにならなければ拒絶しなければ[['''なりません''']]。
[SRC[>>41 5.3]]

[86] この変換は、[[ドメイン名]]を後で[[Uラベル]]式に表示するのであれば、行う[['''べきです''']]。
[SRC[>>41 5.3]]

[87] 変換を行わない場合であっても、与えられた文字列が実際に [[Aラベル]]であるか、
[[Punycode]] の[[復号]]の仕様上非妥当な書式でないかを最低でもチェックする[['''べきです''']]。
[SRC[>>41 5.3]]

[88] [[IDNA]] 未対応の[[アプリケーション]]がもちろんこのチェックを行う必要はありませんが、
対応している[[アプリケーション]]であっても、与えられた[[文字列]]を不透明なものとして扱い、
チェックを省略しても[['''構いません''']]。
もちろんその場合は[[利用者]]に対して行える保護や提供できる情報は少なくなります。
[SRC[>>41 5.3]]

** 文字とラベルのチェック

[89] [[未検証Uラベル]]が次の条件のいずれかに合致する場合には、 [[DNS]]
の [[lookup]] を行わずに拒絶し[['''なければなりません''']]。 [SRC[>>41 5.4]]

- [90] [[NFC]] ではない
- [91] 3文字目と4文字目が [CODE[[[--]]]] ではない
- [92] 1文字目が[[結合文字]]である
- [93] [[導出特性値]]が [[DISALLOWED]] な[[符号位置]]が含まれる
- [94] [[導出特性値]]が [[CONTEXTJ]] な[[符号位置]]が含まれ、[[文脈的規則]]に従っていない
-- [95] [[文脈的規則]]が定義されていない ([[null規則]]である) なら、従っていないとみなします
- [96] [[導出特性値]]が [[CONTEXTO]] な[[符号位置]]が含まれ、[[文脈的規則]]が定義されていない ([[null規則]]である)
-- [97] 名前の解決や等価性のチェックを行う[[アプリケーション]]は、
ここで[[文脈的規則]]に従っているかチェックする必要はなく、
[[文脈的規則]]が定義されていることだけを確認すれば OK です
--- [98] が、チェックして[['''構いません''']]し、チェックした方がより安全です
- [99] [[導出特性値]]が [[UNASSIGNED]] な[[符号位置]]が含まれる [SRC[>>41 5.4]]
-- [116] [[UNASSIGNED]] が含まれていることによる失敗は、それ以外の理由による失敗とは分けて報告するべきです。
それが[[利用者]]に最新版への更新を促すことにもなります。 [SRC[>>118]]

[102] 更に、次の検査を行う[['''べきです''']]。 [SRC[>>41 5.4]]

- [103] [[bidi規則]]を満たすこと

[104] この検査は、他のところでチェックがなされているとわかっている場合など、
特別な状況にあっては省略して構いません。というのも、チェックを通らない文字列を [[lookup]]
しても、[[ワイルドカード]]が使われている場合を除き、単に [[DNS]]
[[lookup]] が失敗するだけであろうからです。ただ、単に[[名前解決]]に失敗したと報告するよりは、
事前にチェックしてそのことを[[利用者]]に伝えられる方が有用かもしれません。 [SRC[>>41 5.4]] 

[105] この検査を通過した[[文字列]]については、 [[lookup]] [[アプリケーション]]はその[[ラベル]]が[[妥当]]であるか否かは
[[DNS]] で[[ラベル]]が存在するか否かによって判断し[['''なければなりません''']]。
[[登録]]されていれば[[妥当]]であり、[[登録]]されていなければ[[妥当性]]は意味を持ちません。
[[lookup]] [[アプリケーション]]が独自に検査して警告を出すなどしても構いませんが、
それを根拠に [[DNS]] に問い合わせないなど通常の処理を行わないとしたら、それはこの[[プロトコル]]に[[適合]]しません。
[SRC[>>41 5.4]]

** Punycode 変換

[106] [[Punycode]] によって[[符号化]]し、 [CODE[[[xn--]]]] を最初に付けます。
[SRC[>>41 5.5]] これで[[Aラベル]]が得られます。

** DNS による名前解決

[107] こうして得られた[[Aラベル]]について、適宜他の[[ラベル]]と組み合わせたり
[[FQDN]] 化したりした上で、 [[DNS]] で[[名前解決]]します。
[SRC[>>41 5.6]]

* Punycode 以外のラベル

[122] 現在 [[IDNラベル]]として正式に利用できる [[ASCIIラベル]]は [[Punycode]]
を用いた [[XNラベル]]だけですが、 [[IDNA2003]] が採用される前は [[RACE]]
や [[UTF-5]] が使われていました。

[123] また、[[イントラネット]]などでは [[ACE]] を使わずに直接 [[UTF-8]]
や [[ISO-8859-1]] などが [[DNS]] 上で利用されることがあります。これは [[IDNA]]
が標準化された後も引き続き行われています。

[124] [[インターネット]]向けにも2000年頃から直接 [[UTF-8]]
を使う方法で名前の登録サービスを提供する業者が出現しましたが、
[[RACE]] や [[Punycode]] による [[ccTLD]] や [[gTLD]] での [[IDN]]
が提供されるになるにつれ、衰退してゆきました。

* 関連

[4] [[国際化ラベル]]に対し、[[ASCII文字]]のみの[[ラベル]]を[[ASCIIラベル]]といいます。
[[ASCIIラベル]]は[[国際化ラベル]]の[[部分集合]]です。

[5] [[国際化ラベル]]の [[Punycode]] 化表現は [[ACEラベル]] ([[IDNA2003]])
や [[Aラベル]] ([[IDNA2008]]) といいます。[[IDNA2003]] はこの[[国際化ラベル]]から
[[ASCIIラベル]]への変換を「[[ToASCII]] [[演算]]」として規定しています。

[24] <http://tools.ietf.org/html/rfc5890#section-2.3.3> には「IDN labels」
という語がありますが、「[[国際化ラベル]]」の意でしょうか。