[3] [DFN[[[大文字]]と[[小文字]]を区別しない]] ([DFN[case‐insensitive]]) [[比較]]は、
[[ASCII]] だけを対象としている間はおおよそ自明に定まりますが、[[ASCII]] 
より大きな[[文字集合]]を扱う場合には様々な可能性があり、処理も複雑化します。

[25] 区別しない[[比較]]は、等しいと判断される[[文字]](列)の組を定義する方法と、
[[case folding]] があります。 [DFN[[[case folding]]]] は、
対象となる[[文字列]]を[[比較]]のための[[正規形]]に変換することであり、
得られた[[文字列]]の単純な[[文字]]の列としての比較によって元々の[[文字列]]が同じかどうかを決定します。

[SEE[ [[大文字と小文字を持つ書字体系]] ]]

[44] ''case'' はここでは[[大文字]]と[[小文字]]の事を指し、
''sensitive'' とは''繊細''という意味,
''insensitive'' はその逆ですから、''大文字・小文字を区別しない''ことをあらわします。


* 大文字と小文字を区別しない比較の方法

[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]] のいずれかの定義に従って大文字・小文字を区別をしない[[一致]]を行います。

[49] 
[[OpenTypeにおける大文字と小文字]],
[[ファイル名における大文字と小文字]]

* 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]




-[46] [CITE@ja[欧文組版のマナー実例: ロゴを文中で再現しない : デザインの現場 小林章の「タイプディレクターの眼」]], [[type_director]], [TIME[2020-12-29T09:19:19.000Z]] <https://blog.excite.co.jp/t-director/29042066/>
- [47] [CITE@ja[欧文組版のマナー実例: ロゴを文中で再現しない(2) : デザインの現場 小林章の「タイプディレクターの眼」]], [[type_director]], [TIME[2020-12-29T09:21:04.000Z]] <https://blog.excite.co.jp/t-director/29043509/>
- [48] [CITE@ja[欧文組版のマナー実例: ロゴを文中で再現しない(3) : デザインの現場 小林章の「タイプディレクターの眼」]], [[type_director]], [TIME[2020-12-29T09:22:14.000Z]] <https://blog.excite.co.jp/t-director/29044683/>


[50] [CITE@en-us[Registered features, a-e (OpenType 1.9.1) - Typography | Microsoft Learn]], [[PeterCon]], [TIME[2024-07-07T00:58:54.000Z]], [TIME[2024-12-06T12:36:20.409Z]] <https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae>


[51] >>50 「casing pair」 大文字と小文字の対のこと

[52] >>50 「bicameral script」 大文字と小文字がある[[用字系]]
