case algorithm

大文字・小文字を区別しない

[3] 大文字小文字を区別しない (case‐insensitive) 比較は、 ASCII だけを対象としている間はおおよそ自明に定まりますが、ASCII より大きな文字集合を扱う場合には様々な可能性があり、処理も複雑化します。

[25] 区別しない比較は、等しいと判断される文字(列)の組を定義する方法と、 case folding があります。 case folding は、 対象となる文字列比較のための正規形に変換することであり、 得られた文字列の単純な文字の列としての比較によって元々の文字列が同じかどうかを決定します。

大文字と小文字を持つ書字体系

[44] case はここでは大文字小文字の事を指し、 sensitive とは繊細という意味, insensitive はその逆ですから、大文字・小文字を区別しないことをあらわします。

大文字と小文字を区別しない比較の方法

[4] ASCII大文字・小文字不区別は、文字集合Unicode であったとしても、 大文字小文字の同一視を行う対象は ASCII文字だけに限定するもので、 実装も簡潔かつ高速です。HTML の構文などラテン文字と少数の記号のみで記述される場面で有用で、 よく用いられています。

[40] byte case-insensitiveは、 0x00-0x7FASCII として解釈した時に大文字小文字を同一視したとみなされるような、 バイト列に関する比較方法です。 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 では言語に依存しない既定 (Default) の方法を定義し、 必要に応じてそれを仕立て (tailoring) 言語や環境に合ったものにカスタマイズして良いこととしています。

[17] 言語依存の大文字小文字の変換の具体例として、 Unicode Standard >>16 には次のものが挙げられています。

[24] このうち >>18>>19 については Unicode Character DatabaseSpecialCasing.txt に情報が含まれています。

プロトコルにおける大文字と小文字

[39] DNS (伝統的ドメイン名) における扱いは、ASCIIラベルを参照。

[32] Stringprep には case folding のための変換表が含まれており、 IDNA2003 で使われる Nameprep などで使われています。

Stringprep 参照。

[33] 多くのプログラミング言語やその文字列操作を行うライブラリーには、 大文字小文字の変換や比較のための関数などが含まれています。 古めの言語では ASCII の範囲での変換が実装されており、 新しめの言語では Unicode のいずれかの定義に従った変換が実装されているのが普通です。

[34] 正規表現の多くの実装には i 修飾子があり、 多くの場合 Unicode のいずれかの定義に従って大文字・小文字を区別をしない一致を行います。

case folding と大文字・小文字

[42] case folding は、ほとんどの場合、大文字小文字に変換します。

[43] Cherokee のように小文字大文字に変換される場合もあります。

歴史

[11] Web では当初大文字小文字の比較をどう行うか明確に定義してこなかったため、 実装によって比較の方法が異なっていたり、場面によって異なっていたりすることもありました。 しかし現在では原則としてASCII大文字・小文字不区別な比較を行うように HTMLDOMCSS などすべて共通化されていて、ごく一部でのみ互換性大文字・小文字不区別が使われています。

大文字・小文字不区別文字列比較算法

[7] HFS Plusファイル名では大文字・小文字不区別文字列比較算法 (Case-Insensitive String Comparison Algorithm) (FastUnicodeCompare) が使用されています。

仕様書

Unicode の版

[9] 大文字小文字の表は >>8 で配布されています。 Unicode の版は明記されておらず、 Unicode の拡張に合わせて更新されている形跡は見当たりません。

古い HTML 5 の定義

[1] Web Forms 2.0比較大文字小文字を区別しない (case‐insensitive) とき、 比較の際には Unicode で規定された case folding を実行しなければなりません

[2] この定義は後に改められ、現在の HTML ではASCII大文字・小文字不区別または互換性大文字・小文字不区別を使っています。

セキュリティー

[14] ほとんどの文字ASCII内、非ASCII内で大文字小文字の変換・比較が行われますが、 一部の文字は比較方法によっては非ASCII文字ASCII文字になることがあり、 注意が必要です。

メモ

[35] OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 2: Recalculated Formula (OpenFormula) Format ( 版) http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.html#LOWER

[36] OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 2: Recalculated Formula (OpenFormula) Format ( 版) http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.html#UPPER

[37] utf8_unicode_ci に対する日本の開発者の見解 - かみぽわーる ( 版) http://blog.kamipo.net/entry/2015/03/08/145045

[41] RFC 7790 - Mapping Characters for Classes of the Preparation, Enforcement, and Comparison of Internationalized Strings (PRECIS) ( 版) https://tools.ietf.org/html/rfc7790

[45] RFC 5323 - Web Distributed Authoring and Versioning (WebDAV) SEARCH () https://tools.ietf.org/html/rfc5323#section-5.18

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]).