/
815.txt
171 lines (120 loc) · 9.7 KB
/
815.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
[3] [DFN[[[大文字]]と[[小文字]]を区別しない]] ([DFN[case‐insensitive]]) [[比較]]は、
[[ASCII]] だけを対象としている間はおおよそ自明に定まりますが、[[ASCII]]
より大きな[[文字集合]]を扱う場合には様々な可能性があり、処理も複雑化します。
[25] 区別しない[[比較]]は、等しいと判断される[[文字]](列)の組を定義する方法と、
[[case folding]] があります。 [DFN[[[case folding]]]] は、
対象となる[[文字列]]を[[比較]]のための[[正規形]]に変換することであり、
得られた[[文字列]]の単純な[[文字]]の列としての比較によって元々の[[文字列]]が同じかどうかを決定します。
[44] [[大文字と小文字を持つ書字体系]]も参照。
* 大文字と小文字を区別しない比較の方法
[4] '''[[ASCII大文字・小文字不区別]]'''は、[[文字集合]]が [[Unicode]] であったとしても、
[[大文字]]と[[小文字]]の同一視を行う対象は [[ASCII文字]]だけに限定するもので、
実装も簡潔かつ高速です。[[HTML]] の構文など[[ラテン文字]]と少数の[[記号]]のみで記述される場面で有用で、
よく用いられています。
[40] '''[[byte case-insensitive]]'''は、 [CODE[0x00]]-[CODE[0x7F]] を [[ASCII]]
として解釈した時に[[大文字]]と[[小文字]]を同一視したとみなされるような、
[[バイト列]]に関する比較方法です。 [[HTTP]] のような [[ASCII]] ベースの[[プロトコル]]を扱う場面で用いられています。
[6] '''[[IRCにおける大文字と小文字]]'''は、 [[IRC]] が[[欧州]]で [[ISO/IEC 646の版]]のもとで開発された歴史的経緯ゆえ、
純粋に[[文字]]についてではなく、 ([[ASCII]] では[[記号]]となっているものも含めた)
特定の[[符号位置]]について[[大文字]]と[[小文字]]の関係が定義されています。
[31] '''[[単純case folding]]'''は、 [[Unicode Standard]] で定義されている最も単純な [[case folding]] です。
[26] '''[[既定無case一致]]'''は、 [[Unicode Standard]] で定義されている基本的な [[case folding]]
([[完全case folding]]) による[[比較]]です。
[28] '''[[正準無case一致]]'''は、 [[Unicode Standard]] で定義されている [[NFC]] 相当の [[case folding]]
による[[比較]]です。
[5] '''[[互換性無case一致]]'''は、[[Unicode Standard]] で定義されている [[NFKC]] 相当の [[case folding]]
による[[比較]]です。
[27] '''[[識別子無case一致]]'''は、 [[Unicode Standard]] で定義されている[[識別子]]のための [[case folding]]
による[[比較]]です。
[29] '''[[i;unicode-casemap]]''' における[[比較]]は、 [[IETF]] によって定義された独自の [[case folding]]
を用いており、 [[Unicode Standard]] が[[小文字]]化を採用しているのに対し、こちらは[[大文字]]化しています。
[38] [[Stringprep]] の[[プロファイル]]にも [[case folding]] が組み込まれていることがあります
(>>32)。
* 言語と大文字・小文字
[15] [[大文字]]と[[小文字]]の変換や比較は[[言語]]や[[地域]]によって違いがあります。
[[Unicode Standard]] では[[言語]]に依存しない[RUBYB[既定]@en[Default]]の方法を定義し、
必要に応じてそれを[DFN[[RUBYB[[[仕立て]]]@en[tailoring]]]]て[[言語]]や環境に合ったものにカスタマイズして良いこととしています。
[REFS[
- [16] <http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf#page=62>
- [30] <http://www.unicode.org/versions/Unicode6.2.0/ch05.pdf#page=29>
]REFS]
[17] [[言語]]依存の[[大文字]]と[[小文字]]の変換の具体例として、 [[Unicode Standard]] [SRC[>>16]]
には次のものが挙げられています。
[FIG[
- [18] [[トルコ語]]における [CODE(char)[[[I]]]]
- [19] [[リトアニア語]]における[[アクセント]]つき [CODE(char)[[[i]]]]
- [20] [[オランダ語]]における [CODE(char)[[[IJ]]]] の [[titlecase]] 化
- [21] [[アクセント]]つき[[ギリシャ文字]]の[[大文字]] 化
- [22] [[アポストロフィ]]など [[caseless]] な文字を含む場合の2文字目以降の [[titlecase]] 化
- [23] [CODE(charname)@en[[[LATIN SMALL LETTER SHARP S]]]] の[[大文字]]化
]FIG]
[24] このうち >>18 と >>19 については [[Unicode Character Database]] の [[SpecialCasing.txt]]
に情報が含まれています。
* プロトコルにおける大文字と小文字
[39] [[DNS]] ([[伝統的ドメイン名]]) における扱いは、[[ASCIIラベル]]を参照。
[32] [[Stringprep]] には [[case folding]] のための変換表が含まれており、
[[IDNA2003]] で使われる [[Nameprep]] などで使われています。
;; [[Stringprep]] 参照。
[33] 多くの[[プログラミング言語]]やその[[文字列]]操作を行う[[ライブラリー]]には、
[[大文字]]と[[小文字]]の変換や比較のための[[関数]]などが含まれています。
古めの[[言語]]では [[ASCII]] の範囲での変換が実装されており、
新しめの[[言語]]では [[Unicode]] のいずれかの定義に従った変換が実装されているのが普通です。
[34] [[正規表現]]の多くの実装には [CODE(regexp)[[[i]]]] [[修飾子]]があり、
多くの場合 [[Unicode]] のいずれかの定義に従って大文字・小文字を区別をしない[[一致]]を行います。
* case folding と大文字・小文字
[42] [[case folding]] は、ほとんどの場合、[[大文字]]を[[小文字]]に変換します。
[43] [[Cherokee]] のように[[小文字]]が[[大文字]]に変換される場合もあります。
* 歴史
[11] [[Web]] では当初[[大文字]]と[[小文字]]の比較をどう行うか明確に定義してこなかったため、
実装によって比較の方法が異なっていたり、場面によって異なっていたりすることもありました。
しかし現在では原則として[[ASCII大文字・小文字不区別]]な比較を行うように [[HTML]]、[[DOM]]、
[[CSS]] などすべて共通化されていて、ごく一部でのみ[[互換性大文字・小文字不区別]]が使われています。
** 大文字・小文字不区別文字列比較算法
[7] [[HFS Plus]] の[[ファイル名]]では[DFN[[RUBYB[[[大文字・小文字不区別文字列比較算法]]]@en[Case-Insensitive String Comparison Algorithm]]]]
([DFN[[[FastUnicodeCompare]]]]) が使用されています。
*** 仕様書
[REFS[
- [10] [CITE[Technical Note TN1150: HFS Plus Volume Format]] ([TIME[2014-03-30 10:39:00 +09:00]] 版) <https://developer.apple.com/legacy/library/technotes/tn/tn1150.html#StringComparisonAlgorithm>
-- [8] [DEL[[CITE[Technical Note TN1150: HFS Plus Volume Format]] <http://developer.apple.com/library/mac/#technotes/tn/tn1150.html#StringComparisonAlgorithm>]]
]REFS]
*** Unicode の版
[9] [[大文字]]・[[小文字]]の表は >>8 で配布されています。 [[Unicode]] の版は明記されておらず、
[[Unicode]] の拡張に合わせて更新されている形跡は見当たりません。
** 古い HTML 5 の定義
[1]
[[Web Forms 2.0]] で[[比較]]に[DFN[[RUBYB[[[大文字]]・[[小文字]]を区別しない]@en[case‐insensitive]]]]とき、
[[比較]]の際には [[Unicode]] で規定された [[case folding]]
を実行'''[[しなければなりません]]'''。
;; <http://www.whatwg.org/specs/web-forms/current-work/#case-insensitive>
[2] この定義は後に改められ、現在の [[HTML]] では[[ASCII大文字・小文字不区別]]または[[互換性大文字・小文字不区別]]を使っています。
* セキュリティー
[14] ほとんどの[[文字]]は[[ASCII]]内、[[非ASCII]]内で[[大文字]]と[[小文字]]の変換・比較が行われますが、
一部の[[文字]]は比較方法によっては[[非ASCII文字]]が[[ASCII文字]]になることがあり、
注意が必要です。
[REFS[
- [12] [CITE@en[Charinfo — "İ"]] ([TIME[2014-03-30 10:50:27 +09:00]] 版) <http://chars.suikawiki.org/char/0130>
- [13] [CITE@en[Charinfo — "ı"]] ([TIME[2014-03-30 10:50:43 +09:00]] 版) <http://chars.suikawiki.org/char/0131>
]REFS]
* メモ
[35] [CITE[OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 2: Recalculated Formula (OpenFormula) Format]]
([TIME[2011-09-29 13:00:00 +09:00]] 版)
<http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.html#LOWER>
[36] [CITE[OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 2: Recalculated Formula (OpenFormula) Format]]
([TIME[2011-09-29 13:00:00 +09:00]] 版)
<http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.html#UPPER>
[37] [CITE@en[utf8_unicode_ci に対する日本の開発者の見解 - かみぽわーる]]
([TIME[2015-03-09 13:57:40 +09:00]] 版)
<http://blog.kamipo.net/entry/2015/03/08/145045>
[41] [CITE@en[RFC 7790 - Mapping Characters for Classes of the Preparation, Enforcement, and Comparison of Internationalized Strings (PRECIS)]]
([TIME[2016-03-31 03:20:06 +09:00]] 版)
<https://tools.ietf.org/html/rfc7790>
[FIG(quote)[
[FIGCAPTION[
[45] [CITE@en[RFC 5323 - Web Distributed Authoring and Versioning (WebDAV) SEARCH]]
([TIME[2017-10-01 13:49:21 +09:00]])
<https://tools.ietf.org/html/rfc5323#section-5.18>
]FIGCAPTION]
> The possible values for "caseless" are "yes" or "no". The default
> value is server-specified. Caseless matching SHOULD be implemented
> as defined in Section 5.18 of the Unicode Standard ('''['''UNICODE5''']''').
]FIG]