-
Notifications
You must be signed in to change notification settings - Fork 4
/
120.txt
203 lines (167 loc) · 8.51 KB
/
120.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
[1] [[IDNA]] の [DFN@en[[CODE@en[ToASCII]]]]
は、[[国際化ラベル]]を[[ASCIIラベル]]に変換する[[演算]]です。
* 仕様書
[REFS[
- [2] [CITE@en[RFC 3490 - Internationalizing Domain Names in Applications (IDNA)]]
([[IETF]] [[提案標準]])
-- [22] [CSECTION@en[4.1 ToASCII]]
<http://tools.ietf.org/html/rfc3490#section-4.1>
- [24] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]] ([TIME[2010-10-30 01:01:25 +09:00]] 版) <http://unicode.org/reports/tr46/#ToASCII>
- [50] [CITE@en[URL Standard]] ([TIME[2016-08-25 16:02:43 +09:00]]) <https://url.spec.whatwg.org/#concept-domain-to-ascii>
]REFS]
* IDNA2003 ToASCII 演算
** 入力
[3]
[[入力]]は、[[国際化名札]]、すなわち
[[Unicode]] [[符号位置]]の列と、[[旗]]
[CODE@en[[[AllowUnassigned]]]]、[[旗]]
[CODE@en[[[UseSTD3ASCIIRules]]]] です。
[SRC@en[RFC 3490 4.1]]
;;
[6]
[[ドメイン名]]全体ではなく、構成する個々の[[名札]]が[[入力]]となります。
[[点]]を[[名札分離子]]として使う場合には、
[CODE(charname)@en[[[FULL STOP]]]],
[CODE(charname)@en[[[FULLWIDTH FULL STOP]]]],
[CODE(charname)@en[[[IDEOGRAPHIC FULL STOP]]]],
[CODE(charname)@en[[[HALFWIDTH IDEOGRAPHIC FULL STOP]]]]
を[[点]]と[['''しなければなりません''']]と規定されています。
[SRC@en[RFC 3490 3.1, 4.]]
** 出力
[4]
[CODE@en[[[ToASCII]]]] [[操作]]は、[[成功]]または[[失敗]]します。
[[成功]]した場合、[[ASCII名札]]、
すなわち [[ASCII]] [[符号位置]]の列を返します。
この[[ASCII名札]]は、入力 (>>3) の[[国際化名札]]と[[等価]]なものです。
[SRC@en[RFC 3490 4.1]]
;;
[5]
[[ドメイン名]]中のいずれかの[[名札]]が
[CODE@en[[[ToASCII]]]] に[[失敗]]するなら、
その[[ドメイン名]]は[[国際化ドメイン名]]として使用[['''してはなりません''']]。
この[[失敗]]への対処は[[応用]]規定とされています。
[SRC@en[RFC 3490 4.1]]
;;
[7]
[[ドメイン名]]を >>6 により分割し、
それぞれの[[名札]]に [CODE@en[[[ToASCII]]]]
を適用した場合、更に[[点]]で結合して[[ドメイン名]]に戻すことになりますが、
[[ASCII]] [[ドメイン名]]とするためには、
[CODE(charname)@en[[[FULL STOP]]]] を使用[['''しなければなりません''']]。
[SRC@en[RFC 3490 3.1]]
** 算法
[11] [[ToASCII]] [[演算]]の実際の処理は次の通りです [SRC@en[RFC 3490 4.1]]。
= [13] [[ASCII]] の範囲
([CODE(char)[[[U+0000]]]]〜[CODE(char)[[[U+007F]]]])
の''外''の[[符号位置]]が含まれていれば、2 へ。
含まれていなければ、 3 へ。
=[14] [[Nameprep]] を適用します ([[旗]]
[CODE@en[[[AllowUnassigned]]]] を使用します)。
[[誤り]]があれば、[[失敗]]とします。
= [15] [[旗]] [CODE@en[[[UseSTD3ASCIIRules]]]]
が設定されていれば、
== [[非LDH]] [[ASCII]] [[符号位置]]
([CODE(char)[[[U+0000]]]]〜[CODE(char)[[[U+002C]]]],
[CODE(char)[[[U+002E]]]], [CODE(char)[[[U+002F]]]],
[CODE(char)[[[U+003A]]]]〜[CODE(char)[[[U+0040]]]],
[CODE(char)[[[U+005B]]]]〜[CODE(char)[[[U+0060]]]],
[CODE(char)[[[U+007B]]]]〜[CODE(char)[[[U+007F]]]])
が含まれていないことを確認します。
= [16] 最初の[[文字]]や最後の[[文字]]が [CODE(char)[[[U+002D]]]]
でないことを確認します。
= [17] [[ASCII]] の範囲
([CODE(char)[[[U+0000]]]]〜[CODE(char)[[[U+007F]]]])
の''外''の[[符号位置]]が含まれていれば、 5
に進みます。含まれていなければ、 6 に進みます。
= [18] [[ACE接頭辞]]で始まら''ない''ことを確認します。
= [19] [[Punycode]] により[[符号化]]します。
[[誤り]]があれば、[[失敗]]とします。
= [20] [[ACE接頭辞]]をはじめに追加します。
= [21] [[符号位置]]の数が1[[以上]]63[[以下]]であることを確認します。
[12] 確認して駄目だった場合にどうするとも書かれていませんが、どうするのでしょう・・・。
[[失敗]]となることを想定しているように見えますが、明記はされていません。
** 性質
[8] [[ToASCII]] [[演算]]は次のような性質を持っています。
-[9] すべてが [[ASCII]] [[文字]]の[[名札]]を[[入力]]とした場合、
([[失敗]]するか、または) そのままの[[文字列]]を返します。
[SRC@en[RFC 3490 4.1]]
-[10] [CODE@en[[[ToASCII]]]] は[[冪等]]です (複数回適用しても、
同じ結果が得られます)。
[SRC@en[RFC 3490 4.1]]
** 文脈
[35] [[IDNA2003]] [[ToASCII]] は次の場面で使われます。
[FIG(short list)[
- [CODE[[[dNSName]]]]
- [CODE[[[SRVName]]]]
]FIG]
* UTS #46 ToASCII 演算
[25] [[UTS #46]] では[[ドメイン名]]に対して [[ToASCII]] [[演算]]が次の通り定義されています
[SRC[>>24]]。
[37] [[入力]]は、次のものです [SRC[>>24]]。
[FIG(list members middle)[
: [VAR[ドメイン名]] : [[Unicode文字列]]
: [VAR[[[UseSTD3ASCIIRules]]]] : [[boolean]]
: [VAR[処理オプション]] : [[移行的処理]]または[[非移行的処理]]
: [VAR[VerifyDnsLength]] : [[boolean]]
]FIG]
[38] [[出力]]は、[[Unicode文字列]]または[[失敗]]です。
[39] 次のようにします [SRC[>>24]]。
[FIG(steps)[
= [26] ([VAR[結果]]、[VAR[誤り]]) を、[[Unicode IDNA互換性処理]]を実行した結果に設定します。
[FIG(list members middle)[
: [VAR[ドメイン名]] : [VAR[ドメイン名]]
: [VAR[処理オプション]] : [VAR[処理オプション]]
: [VAR[[[UseSTD3ASCIIRules]]]] : [VAR[[[UseSTD3ASCIIRules]]]]
]FIG]
= [33] [VAR[誤り]]が[[真]]なら、
== [48] [[失敗]]を返し、ここで停止します。
= [27] [VAR[ラベル群]]を、[VAR[結果]]を [CODE(char)[U+002E]] [CODE(charname)@en[FULL STOP]]
で分割した結果に設定します。
= [40] [VAR[ラベル群]]の各項目[VAR[ラベル]]について、
== [42] [VAR[ラベル]]に[[非ASCII文字]]が含まれるなら、
=== [29] [VAR[符号化ラベル]]を、 [CODE[xn--]] の後に[VAR[ラベル]]に[[Punycode符号化]]を適用した結果を連結したものに設定します。
=== [28] [VAR[ラベル群]]の[VAR[ラベル]]を、[VAR[符号化ラベル]]で置き換えます。
以後[VAR[ラベル]]は[VAR[符号化ラベル]]とします。
== [41] [VAR[VerifyDnsLength]] が[[真]]なら、
=== [32] [VAR[ラベル]]の長さが[[範囲]] [ [N[1]], [N[63]] ] に含まれなければ、
==== [44] [[失敗]]を返し、ここで停止します。
= [49] [VAR[結果]]を、[VAR[ラベル群]]の各項目を順に
[CODE(char)[U+002E]] [CODE(charname)@en[FULL STOP]] で連結した結果に設定します。
= [30] [VAR[VerifyDnsLength]] が[[真]]なら、
== [31] [VAR[結果]]の長さ (末尾が [CODE[U+002E]] の場合、それを無視した長さ)
が[[範囲]] [ [N[1]], [N[253]] ] に含まれなければ、
=== [43] [[失敗]]を返し、ここで停止します。
= [45] [VAR[結果]]を返します。
]FIG]
[46] テストデータ:
[REFS[
- [47] [CITE[IdnaTest.txt]] ([TIME[2016-06-21 06:36:28 +09:00]]) <http://www.unicode.org/Public/idna/latest/IdnaTest.txt>
]REFS]
[58] [[ドメインをASCIIに]]する操作で呼び出されます。
* ドメインを ASCII に
[51] [DFN[[RUBYB[ドメインをASCIIに]@en[domain to ASCII]]]]する演算は、
[VAR[ドメイン]]を次のようにします [SRC[>>50]]。
[FIG(steps)[
= [52] [VAR[結果]]を、 [[UTS #46]] [[ToASCII]] の結果に設定します。
[FIG(list members middle)[
: [VAR[ドメイン名]] : [VAR[ドメイン]]
: [VAR[[[UseSTD3ASCIIRules]]]] : [[偽]]
: [VAR[処理オプション]] : [[移行的処理]]
: [VAR[VerifyDnsLength]] : [[偽]]
]FIG]
= [53] [VAR[結果]]が[[失敗]]なら、
== [54] [[構文違反]]とします。
== [55] [[失敗]]を返します。
= [56] それ以外なら、
== [57] [VAR[結果]]を返します。
]FIG]
[59] [[ホスト構文解析器]]から呼び出されます。
* 関連
[23] 逆の操作を行う [[ToUnicode]] [[演算]]もあります。
* 歴史
[34] [CITE@en[Web Applications 1.0 r8780 Some reference updates, and an example of incumbent vs entry scripts]]
( ([TIME[2014-09-17 14:47:00 +09:00]] 版))
<https://html5.org/r/8780>
[36] [CITE@en[Cleanup definitions of domainToASCII() and domainToUnicode(). Give up… · whatwg/url@d18639f]]
([TIME[2015-08-18 12:14:00 +09:00]] 版)
<https://github.com/whatwg/url/commit/d18639f13cb710938f2251a8f0e40b637aa82823>