/
622.txt
242 lines (189 loc) · 13.2 KB
/
622.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
[62] [DFN[ToUnicode]] は、[[Unicode]] の[[文字列]]をできるだけ[[正規化]]し、
[[Punycode]] を[[復号]]する[[操作]]です。
[[IDNA2003]] では[[ラベル]]に対して、[[UTS #46]] では[[ドメイン名]]に対して
[[ToUnicode]] [[操作]]が定義されています。また、 [[UTS #46]] では実質的に [[ToUnicode]]
と同じ[[操作]]である [DFN[[[Unicode IDNA互換性処理]]]]と [DFN[[[IDNA2008前処理]]]]も定義されています。
* 仕様書
- [26] [[IDNA2003]]
-- [2] [CITE@en[RFC 3490 - Internationalizing Domain Names in Applications (IDNA)]]
<http://tools.ietf.org/html/rfc3490#section-4.2>
- [22] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]] ([TIME[2010-10-30 01:01:25 +09:00]] 版)
-- [25] <http://www.unicode.org/reports/tr46/#Compatibility_Processing>
-- [44] '''<http://www.unicode.org/reports/tr46/#Processing>'''
-- [17] '''<http://www.unicode.org/reports/tr46/#ToUnicode>'''
-- [23] '''<http://www.unicode.org/reports/tr46/#IDNA2008_Preprocessing>'''
* IDNA2003 の ToUnicode 演算
[1] [[IDNA2003]] の [DFN@en[[CODE@en[ToUnicode]]]] [[演算]]は、
[[国際化ラベル]]を[[ACEラベル]]でない[[国際化ラベル]]に変換します。
大まかに言うと [[Punycode]] を[[復号]]して人間可読な[[文字列]]に戻す操作です。
** 入力
- [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]]。
* IDNA2008 前処理
[20] [[UTS #46]] の[DFN[[RUBYB[[[IDNA2008前処理]]]@en[Preprocessing for IDNA2008]]]]は、
[WEAK[(完全な [[Unicode IDNA互換性処理]]を行うのとは違って)]]
[[IDNA2008]] の規定する処理に対する[[前処理]]として使うことができる[[算法]]であり、
その[[適合性]]の[[クラス]]です。これは移行処理が特に必要がない場面で利用できます
[SRC[>>25]]。
[21] [[IDNA2008前処理]]とは、[[入力]]となる[[文字列]]に [[ToUnicode]] [[演算]]
(>>19) を適用することと定義されています [SRC[>>23]]。
;; [24] [[IDNA2008前処理]]を適用すると[[大文字]]から[[小文字]]への変換など
[[IDNA2003]]では行われていた処理の一部がなされるようになります。
これだけでは [[IDNA2008]] で認められていない[[文字]]が一部素通しされてしまいますが、
「前」処理であるので問題にはなりません [SRC[>>23]]。
* Unicode IDNA 互換性処理
[63] [DFN[Unicode IDNA [RUBYB[互換性処理][Compatibility Processing]]]]は[[ドメイン名]]に含まれる[[文字]]を[[正規化]]し、
[[Punycode]] を[[復号]]します。これは [[ToUnicode]] [[操作]]そのものであると共に、
[[IDNA2008前処理]]として [[IDNA2008]] 本体での処理の前段階として用いたり、
[[ToASCII]] [[操作]]の最初の手順として用いたりします。 [[Unicode]]
に戻すために使うだけでなく、 [[ASCII]] ([[Punycode]]) にしたいときもまずはできるだけ
[[Unicode]] 化して[[正規化]]した状態にするということですね。
[41] [[入力]]は、次のものです [SRC[>>44]]。
[FIG(list members)[
: [VAR[ドメイン名]] : [[Unicode文字列]]
: [VAR[[[UseSTD3ASCIIRules]]]] : [[boolean]]
: [VAR[処理オプション]] : [DFN[Transitional_Processing]]
([DFN[[RUBYB[[[移行的処理]]]@en[Transitional Processing]]]]) または
[DFN[Nontransitional_Processing]] ([DFN[[RUBYB[[[非移行的処理]]]@en[Nontransitional Processing]]]])
]FIG]
[64] [[移行的処理]]と[[非移行的処理]]の違いは [[IDNA2003]] と [[IDNA2008]]
で [[Aラベル]] ([[ACEラベル]]) への変換結果が変わってしまう4文字の扱いだけ [SRC[>>25]] です。
[[移行的処理]]はこの4文字を [[IDNA2003]] 風に[[写像]]して他の文字に変えたり削除したりしますが、
[[非移行的処理]]ではそのまま残します。
[45] [[出力]]は、 ([[Unicode文字列]], [[boolean]]) の組です。
[[Unicode文字列]]は、変換結果です。 [[boolean]] は、[[誤り]]の有無を表します。
[[誤り]]があっても、出来る限りの変換結果の文字列が返されます。 [SRC[>>44]]
[34] 次のようにします [SRC[>>44]]。
[FIG(steps)[
= [46] [VAR[結果]]を、[[空文字列]]に設定します。
= [42] [VAR[誤り]]を、[[偽]]に設定します。
= [49] [RUBYB[[[写像]]]@en[map]]: [VAR[ドメイン名]]の各[[符号位置]][VAR[符号]]について、
順に、
== [50] [[IDNA写像表]]における[VAR[符号]]の[[状態値]]により、
[FIG(switch)[
: [RUBYB[[[禁止]]]@en[disallowed]] : [VAR[誤り]]を、[[真]]に設定します。
: [RUBYB[[[無視]]]@en[ignored]] : [VAR[符号]]を、 [CODE[null]] に設定します。
: [RUBYB[[[写像]]]@en[mapped]] :
[VAR[符号]]を、[[IDNA写像表]]における[VAR[符号]]の[[写像値]]に設定します。
: [RUBYB[[[偏差]]]@en[deviation]] :
[VAR[処理オプション]]が [[Transitional_Processing]] なら、
[VAR[符号]]を、[[IDNA写像表]]における[VAR[符号]]の[[写像値]]に設定します。
]FIG]
== [47] [VAR[符号]]が [CODE[null]] でなければ、
=== [43] [VAR[結果]]の末尾に[[符号位置]][VAR[符号]]を追加します。
= [58] [RUBYB[[[正規化]]]@en[normalize]]:
[VAR[結果]]を、 [VAR[結果]]に [[NFC]] を適用した結果に設定します。
= [59] [RUBYB[[[切断]]]@en[break]]:
[VAR[ラベル群]]を、[VAR[結果]]を [CODE[.][U+002E]] で分割した結果に設定します。
= [60] [RUBYB[[[変換]]・[[妥当性検証]]]@en[convert/validate]]:
[VAR[ラベル群]]の各項目[VAR[ラベル]]について、順に、
== [61] [VAR[ラベル]]の先頭が [CODE[xn--]] なら、
=== [48] [VAR[結果]]を、[VAR[ラベル]]から先頭4文字を除去したものに [[Punycode]]
の[[復号]]を適用した結果に設定します。
=== [28] [VAR[結果]]が[[失敗]]の場合、
==== [39] [VAR[誤り]]を、[[真]]に設定します。
=== [51] それ以外の場合、
==== [29] [VAR[ラベル群]]における[VAR[ラベル]]を、[VAR[結果]]で置き換えます。
==== [30] [VAR[結果]]を、[VAR[ラベル]]について[[非移行的処理]]用の妥当性条件に合致するか検証
[WEAK[([[ラベル]]を参照。)]] した結果に設定します。
==== [52] [VAR[結果]]が[[偽]]なら、
===== [53] [VAR[誤り]]を、[[真]]に設定します。
== [31] それ以外の場合、
=== [32] [VAR[結果]]を、[VAR[ラベル]]について[VAR[処理オプション]]用の妥当性条件に合致するか検証
[WEAK[([[ラベル]]を参照。)]] した結果に設定します。
===- [38] ここで、[[妥当性]]の条件には「[[NFC]] であること」が含まれますが、
>>23 で[[正規化]]していて、 >>59 の[[切断]]はその結果に影響しないので、
これは省略できます [SRC[>>44 4.5]]。
=== [54] [VAR[結果]]が[[偽]]なら、
==== [55] [VAR[誤り]]を、[[真]]に設定します。
= [57] [VAR[結果]]を、[VAR[ラベル群]]の各項目を [CODE[.][U+002E]] で連結した結果に設定します。
= [56] ([VAR[結果]]、[VAR[誤り]]) を返します。
]FIG]
[33] [VAR[誤り]]が[[真]]なら[[成功]]、そうでなければ[[失敗]]です。 [SRC[>>44]]
[65] 実装は、[[利用者]]に[[表示]]する時には、更に変更を加えても構いません。
例えば[VAR[誤り]]が[[真]]に設定される原因の部分を [CODE[U+FFFD]]
に置き換えたりスルことが[RUBYB[推奨]@en[recommend]]されます。 [SRC[>>44]]
[35] この[[算法]]は[[冪等]]です。 [SRC[>>44]]
[37] [[移行的処理]]、[[非移行的処理]]のどちらであっても、元々 [[Punycode]]
化されていれば、それは変更されずに出力されます。ですから、
[[IDNA写像表]]の[[状態値]]が[[偏差]]の[[文字]]はそのままでは[[移行的処理]]か[[非移行的処理]]かによって結果が変わってしまいますが、
[[Punycode]] 化した[[Aラベル]]であれば回避できます。 [SRC[>>44]]
** 移行的処理と非移行的処理の選択
[66] 移行期間中の [[DNS]] [[lookup]] では[[移行的処理]]を、表示を含むそれ以外の場面では[[非移行的処理]]を使うべきです。
[SRC[>>25 2.1]]
両者の違いは[[偏差]]に分類される4文字だけであり、 [[lookup]] では[[移行的処理]]を使っていたとしても、
表示においては[[非移行的処理]]が[[利用者]]の入力により近い形になるので好ましいです。
** レジストリーにおける対応
[67] [[レジストリー]]にあっては次のいずれかの対応を行うことが強く推奨されています
[RSC[>>25 2.2]]。
- [[Bundling]]: [[移行的処理]]と[[非移行的処理]]の結果が異なるなら、両方が登録される場合には[[登録者]]が同じでなければならない
- [[Blocking]]: [[移行的処理]]と[[非移行的処理]]の結果が異なるなら、両方が登録されることを認めない、あるいはそもそも[[偏差]]の4文字を認めない
** 例
[40] <http://www.unicode.org/reports/tr46/#Table_Example_Processing> にこの[[算法]]の適用例がいくつも示されています。
** メモ
[36] [[利用者]]に[[ドメイン名]]を提示する時には更に変更を加えても構いません。
禁止されている[[文字]]を [CODE(char)[[[U+FFFD]]]] に置き換えたり、
[[妥当性検証]]で失敗した[[ラベル]]を [CODE(char)[[[U+FFFD]]]] その他の表示により[[利用者]]に示したりするのがよいとされています。 [SRC[>>44]]
* 文脈
[27] [[IDNA2003]] [[ToUnicode]] は次の場面で使われます。
[FIG(short list)[
- [CODE[[[dNSName]]]]
- [CODE[[[SRVName]]]]
]FIG]
* 関連
[14] 逆の操作として、 [[ToASCII]] [[演算]]があります。
[FIG(quote)[
[FIGCAPTION[
[6] [CITE@en[479520 – (IDNA2008) Implement IDNA2008 and Unicode UTS #46]]
([TIME[2015-03-24 19:03:59 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=479520#c100>
]FIGCAPTION]
> my understanding is that Microsoft and Google do not want to switch away from Transitional until at least some solution is found to the attacks mentioned in this bug.
]FIG]
[68] [CITE@en[Cleanup definitions of domainToASCII() and domainToUnicode(). Give up… · whatwg/url@d18639f]]
([TIME[2015-08-18 12:14:04 +09:00]] 版)
<https://github.com/whatwg/url/commit/d18639f13cb710938f2251a8f0e40b637aa82823>
[69] [CITE@en[Add a section on rendering URLs with some advice around bidirectional… · whatwg/url@d1152b9]]
([TIME[2015-08-27 11:53:32 +09:00]] 版)
<https://github.com/whatwg/url/commit/d1152b94a16ae91e1f72d128fd5ef589635f0e7c>