-
Notifications
You must be signed in to change notification settings - Fork 4
/
869.txt
174 lines (136 loc) · 10.4 KB
/
869.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
* 仕様書
[REFS[
- [3] [CITE@en[RFC 7564 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]] ([TIME[2015-12-21 04:49:41 +09:00]] 版) <https://tools.ietf.org/html/rfc7564>
-- [5] [CITE@en[RFC 7564 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]] ([TIME[2015-12-21 04:49:41 +09:00]] 版) <https://tools.ietf.org/html/rfc7564#section-1>
-- [17] [CITE@en[RFC 7564 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]] ([TIME[2015-12-21 04:49:41 +09:00]] 版) <https://tools.ietf.org/html/rfc7564#section-3>
-- [13] [CITE@en[RFC 7564 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]] ([TIME[2015-12-21 04:49:41 +09:00]] 版) <https://tools.ietf.org/html/rfc7564#section-4>
]REFS]
* 呼称
[6] 「PRECIS」は、「''pr''eparation, ''e''nforcement, and
''c''omparison of ''i''nternationalized ''s''trings」の意味です [SRC[>>5]]。
* 文字列クラスとプロファイル
[11] 前身の [[Stringprep]] はいくつかの[[文字集合]]や[[写像]]を定義した上で、
[[応用]]ごとにどれを利用するか決定し、「[[プロファイル]]」
とする形を採っていました。
[12] それに対して [[PRECIS]] は、[[文字列クラス]]を少数定義しており、
[[応用]]は必要に応じてそれに規則を追加して[[プロファイル]]とすることも認められてはいるものの、
[[応用]]ごとに[[プロファイル]]をどんどん増やしていくのは[[驚き最小の原則]]違反であるから[RUBYB[非推奨]@en[discouraged]]である
[SRC[>>5]] としています。原則として[[文字列クラス]]を共用とすることで、
[[ライブラリー]]のような形で[[応用]]間で[[符号位置]]の表を共用できる [SRC[>>5]]
とされています。[[利用者]]もいろいろな文脈でどの[[文字]]が使えるか正確に予測できる
[SRC[>>5]] ともされています。
[7] [[PRECIS]] は[[文字集合]]や[[写像]]を直接規定するのではなく、
[[符号位置]]の[[特性]]によって定義する形を採っており、
[[Unicode]] の改版に追随できる [SRC[>>5]] とされています。
;; [[Stringprep]] では [[Unicode 3.2]] 固定とされていました。
;; [9] 決定方法が[[規定]]とされている一方で、最新の [[Unicode]]
に適用した結果が [[IANA登録簿]]に登録される [SRC[>>5]] こととされています。
[8] 定義に用いられる[[符号位置]]の条件の多くは、 [[IDNA2008]]
の規定が参照されています [SRC[>>5]]。
[10] [[PRECIS]] は[[文字列]]に対する演算を次のように分類しています。
[FIG(list)[
- [18] [RUBYB[執行]@en[enforcement]]は、
ある[[文字列]]に対して、
その[[文字列]]が特定の文脈で使うことができるかどうかを決定するため、
特定の[[文字列クラス]]や[[プロファイル]]に関する規則をすべて適用することをいいます
[SRC[>>17]]。
- [19] [RUBYB[比較]@en[comparison]]は、
2つの[[文字列]]に対して、
両者が[RUBYB[[[等価]]]@en[equivalent]]かどうかを決定するため、
特定の[[文字列クラス]]や[[プロファイル]]に関する規則をすべて適用することをいいます
[SRC[>>17]]。
- [20] [RUBYB[準備]@en[preparation]]は、
ある[[文字列]]に対して、
そこに含まれる[[文字]]が特定の[[文字列クラス]]で認められたもののみとなるようにすることをいいます
[SRC[>>17]]。
]FIG]
[21] ほとんどの場合、[[サーバー]]のような決定権を持つ側は[[執行]]する責任があり、
その他の[[クライアント]]などの側は[[準備]]だけすれば十分です。
これは次のような理由からとされています。 [SRC[>>17]]
[FIG(list)[
- [22] [[クライアント]]は[[メモリー]]や処理能力が劣っているかもしれませんが、
[[サーバー]]は十分な能力を持つのが普通です。
- [23] [[クライアント]]側はそもそも[[利用者]]に入力させる[[文字]]を制限するのが簡単です。
- [24] [[番地]]や[[識別子]]で使える[[文字]]について決定権を持つのは[[サーバー]]です。
- [25] [[クライアント]]が適切に文字列を生成することは (特に[[セキュリティー]]に関わる場面では)
信用できません。
]FIG]
[15] なお、 [[PRECIS]] の操作は、基本的には不可逆です [SRC[>>5]]。
[EG[
[16] 例えば[[大文字]]を[[小文字]]に変換したり、[[正規化]]したりすると、
元の状態には復元できないのが普通です。
]EG]
[27] [[RFC 7564]] は、 [[IETF]] の議論の結果として次の2つの[DFN[[RUBYB[[[文字列クラス]]]@en[string class]]]]を規定しています [SRC[>>13]]。
[14] [CODE[[[IdentifierClass]]]] は、
[[利用者]]の[[アカウント]]、 [[venue]] ([[チャット室]]など)、
情報源 (データフィードなど)、データの[[集成]] ([[ファイル]]など)
といった[[ネットワーク]]上の[[実体]]を[[識別]]したり、[[番地付け]]したりするための、
[[letter]] や[[数字]]や一部の[[記号]]の列です。
いろいろな[[アプリケーションプロトコル]]での[[利用者]]の混乱を最小化させ、
表現力よりも安全性を優先させることを意図したものです。 [SRC[>>13]]
[26] [CODE[[[FreeformClass]]]] は、
[[合言葉]]や、
[[装置]]や[[チャット室]]の参加者の[[人間]]向けの[[ニックネーム]]のような表示要素など、
自由形の文字列に使う、
[[letter]] や[[数字]]や[[記号]]や[[間隔]]やその他の[[文字]]の列です。
ほとんどどんな [[Unicode文字]]も使うことができ、
安全性よりも表現力を優先させることを意図したものです。 [SRC[>>13]]
;; [28] [[RFC]] [SRC[>>13]] は将来この他の[[文字列クラス]]を必要に応じて定義する可能性も排除していません。
[29] [[文字列クラス]]は、次の4つの[RUBYB[挙動的規則]@en[behavioral rule]]により定義されています
[SRC[>>13]]。
[FIG(list)[
:[RUBYB[妥当]@en[valid]]:
[[文字列]]において[[妥当]]として扱われる[[符号位置]]を定義します。
:[RUBYB[文脈的規則必須]@en[contextual rule required]]:
[[文脈的規則]] ([CODE[[[CONTEXTJ]]]] / [CODE[[[CONTEXTO]]]])
が満たされる時だけ認められると扱われる[[符号位置]]を定義します。
:[RUBYB[禁止]@en[disallowed]]:
[[文字列]]から除外される必要がある[[符号位置]]を定義します。
:[RUBYB[未割当]@en[unassigned]]:
[[応用]]が使う [[Unicode]] の版で未知の[[符号位置]]が現れた時の[[応用]]の挙動を定義します。
]FIG]
* 歴史
** Stringprep から PRECIS へ
[1] [[IDNA2003]] や、その他の[[識別子]]等を扱う [[IETF]]
の各種[[プロトコル]]は、 [[RFC 3454]] [[Stringprep]] によって
[[Unicode]] [[文字列]]の[[正規化]]を行っていました。
;; [[Stringprep]] も参照。
[2] しかし [[Stringprep]] は [[Unicode 3.2]] に固定されその後改版できずに放置されているなど、
色々な問題を抱えていました。 [[IDNA2008]] は [[Stringprep]] を放棄して独自路線に進みました。
(もっともその路線は市場には支持されず、 [[Stringprep]] を別の形で拡張した
[[UTS #46]] が使われているわけですが...)
[145] [[RFC 6885]] は [[Stringprep]] の[[プロファイル]]とその問題点をまとめたものです。 [[Stringprep]]
は [[Unicode 3.2]] に固定されているなど問題があり [[IDNA2008]] は [[Stringprep]] を使わなくなりましたが、
新しいプロトコルは改版可能であるなど [[DNS]] とは事情が異なるとして、それとは別の方法で [[Stringprep]]
を改良する必要があると指摘し、[[プロファイル]]の用法を分析しています。
[REFS[
- [144] [CITE@en[RFC 6885 - Stringprep Revision and Problem Statement for the Preparation and Comparison of Internationalized Strings (PRECIS)]] ([TIME[2013-07-29 10:54:24 +09:00]] 版) <http://tools.ietf.org/html/rfc6885>
]REFS]
[146] これを踏まえて [[IETF]] では「Preparation and Comparison of Internationalized Strings」を略して「[[PRECIS]]」
と称し、 [[Stringprep]] を改訂するべく [DFN[[[PRECIS WG]]]] を設置しました。
** PRECIS の開発
[141] [CITE@en[draft-ietf-precis-problem-statement-02 - Stringprep Revision Problem Statement]]
( ([TIME[2011-04-01 08:20:57 +09:00]] 版))
<http://tools.ietf.org/search/draft-ietf-precis-problem-statement-02>
[112] [CITE@en[draft-ietf-precis-mappings-08 - Mapping characters for PRECIS classes]]
([TIME[2014-12-30 20:53:58 +09:00]] 版)
<https://tools.ietf.org/html/draft-ietf-precis-mappings-08>
[147] [CITE@en[draft-ietf-precis-nickname-16 - Preparation, Enforcement, and Comparison of Internationalized Strings Representing Nicknames]]
([TIME[2015-03-03 17:06:31 +09:00]] 版)
<https://tools.ietf.org/html/draft-ietf-precis-nickname-16>
[148] [CITE@en[draft-ietf-precis-saslprepbis-14 - Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords]]
([TIME[2015-03-03 17:19:07 +09:00]] 版)
<https://tools.ietf.org/html/draft-ietf-precis-saslprepbis-14>
[149] [CITE@en[draft-ietf-precis-framework-23 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]]
([TIME[2015-02-24 08:26:08 +09:00]] 版)
<https://tools.ietf.org/html/draft-ietf-precis-framework-23>
[150] [CITE@ja[JPRSの米谷嘉朗がIETF PRECISワーキンググループの共同議長に就任 / 株式会社日本レジストリサービス(JPRS)]]
([TIME[2015-03-22 21:12:25 +09:00]] 版)
<http://jprs.co.jp/press/2010/100615.html>
[151] [CITE@en[stpeter/precis-framework]]
([TIME[2015-03-22 21:14:12 +09:00]] 版)
<https://github.com/stpeter/precis-framework>
** RFC 7564
[4] 2015年に [[PRECIS]] 全体を規定する [DFN[[[RFC 7564]]]]
が出版され、 [[RFC 3454]] は[[廃止]]されました。
引き続き同年中に各種[[プロファイル]]が出版されています。