[1] [DFN[既定 case 変換]]、[DFN[既定 case folding]]、[DFN[既定無 case 一致]]は、
[[Unicode]] [[文字列]]に関する[[言語]]に依存しない[[大文字]]と[[小文字]]の変換や[[大文字]]と[[小文字]]を[[区別しない比較][大文字・小文字不区別]]の方法です。

* 仕様書

[REFS[
- [4] <http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf#page=62>
- [8] [CITE@en-us[UAX #44: Unicode Character Database]] ([TIME[2013-09-27 22:15:15 +09:00]] 版) <http://www.unicode.org/reports/tr44/#Casemapping>
- [31] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T08:33:51.968Z]] <https://www.unicode.org/reports/tr44/#Casemapping>
- [7] <http://www.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt>
- [6] <http://www.unicode.org/Public/UCD/latest/ucd/CaseFolding.txt>
]REFS]

* 既定 case 変換、既定 Case Folding、既定無 Case 一致

[12] [DFN[[RUBYB[既定 case 変換]@en[default case conversion]]]]は次の3つの演算 [SRC[>>4]] です。

- [13] [DFN[[CODE[[[toUppercase([VAR[X]])]]]]]]: 各[[文字]]に対して [CODE[[[Uppercase_Mapping([VAR[C]])]]]]
- [14] [DFN[[CODE[[[toLowercase([VAR[X]])]]]]]]: 各[[文字]]に対して [CODE[[[Lowercase_Mapping([VAR[C]])]]]]
- [15] [DFN[[CODE[[[toTitlecase([VAR[X]])]]]]]]:
-= [[UAX #29]] により[[語境界]]を探し、
-= [[語]]の最初の [[cased文字]]について [CODE@en[[[Titlecase_Mapping([VAR[C]])]]]] を適用し
-= [[語]]中のそれ以後の各[[文字]]に対して [CODE[[[Lowercase_Mapping([VAR[C]])]]]] を適用する
- [16] これらは完全 case 変換 (>>9) に加えて、文脈依存の写像 (>>10) も適用する

[2] [DFN[[RUBYB[既定 Case Folding]@en[Default Case Folding]]]]は
[DFN[[CODE[toCasefold([VAR[X]])]]]] と表記され、各[[文字]]に対して
[CODE[Case_Folding([VAR[X]])]] を適用することをいいます [SRC[>>4]]。

;; [19] これらは[[文字列]]に対する演算です。

[20] 既定 case 変換には文脈依存の写像の適用も含まれていますが、既定 Case Folding には含まれていません。
という点で既定 Case Folding の方が単純な演算です。
[CODE@en[[[toCasefold([VAR[X]])]]]] は[[小文字]]へと変換しますが、 [CODE@en[[[toLowercase([VAR[X]])]]]]
と同じではありません。

[21] 入力が[[正規化形]]だとしても、既定 Case Folding の結果が[[正規化形]]とは限りません [SRC[>>4]]。
これはたとえ入力が[[小文字]]のみであったとしてもです。

[22] [DFN[[RUBYB[既定無 Case 一致]@en[Default Caseless Matching]]]]は、2つの[[文字列]]の[[比較]]演算で、
両者に [CODE[[[toCasefold([VAR[X]])]]]] を適用した結果が等しいことをいいます [SRC[>>4]]。

;; [17] ここでいう「既定」とは、[[言語]]などによる[[仕立て]]の無い状態であることを指すようです。

[32] [[IDNA2008]] の [CODE[Unstable]] は [CODE[toCase[ASIS[F]]old]]
を使っています。

[3] [[PRECIS]] は [[Default Case Foloding]] を[['''推奨''']]しています。

* 完全 case 写像、完全 case folding

[9] [DFN[[RUBYB[完全 case 写像]@en[full case mapping]]]]、[DFN[[RUBYB[完全 case folding]@en[full case folding]]]]
は [[SpecialCasing.txt]] と [[UnicodeData.txt]] に含まれるデータから決まる[[写像]]で、次のように表記されます
[SRC[>>4]]。
- [DFN[[CODE@en[Lowercase_Mapping([VAR[C]])]]]]
- [DFN[[CODE@en[Titlecase_Mapping([VAR[C]])]]]]
- [DFN[[CODE@en[Uppercase_Mapping([VAR[C]])]]]]
- [DFN[[CODE@en[Case_Folding([VAR[C]])]]]]

;; [18] これらは[[文字]]に対する演算です。

[5] [CODE[Case_Folding([VAR[C]])]] は [[CaseFolding.txt]] (>>6) に含まれていて、状態欄の値が「[[C]]」
か「[[F]]」のもの (それ以外は無変換) です。

[24] 1対多の写像は [[SpecialCasing.txt]] に、1対1の写像は [[UnicodeData.txt]] に含まれています。
重複する場合は前者が採用されることになっています [SRC[>>4]]。

[EG[
[25] [CODE(char)[[[U+0130]]]] の[[小文字]]は [[UnicodeData.txt]] によれば [CODE(char)[[[U+0069]]]]
ですが、 [[SpecialCasing.txt]] によれば [CODE(char)[[[U+0069]] [[U+0307]]]] で、後者が
[CODE(char)[[[Lowercase_Mapping([VAR[C]])]]]] の値です。
]EG]

;; [11] ここでいう「完全」とは、 [[単純case folding]] に対しての完全性を示しているようです。

[29] [[写像]] [CODE[[[Case_Folding]]]] の一覧は >>28 にあります。

[REFS[
- [28] [CITE@en[Character mapping "unicode:Case_Folding"]] ([TIME[2016-01-04 21:41:51 +09:00]] 版) <https://chars.suikawiki.org/map/unicode%3ACase_Folding>
]REFS]

[33] 
採用例: [SEE[ [[ファイル名]] ]]

* 文脈依存の case 変換

[10] [[文字]]だけではなくその文脈によって決まる大文字と小文字の関係として、次のものが定義されています
[SRC[>>4]]。

[FIG(short list)[
- [CODE[[[Final_Sigma]]]]
- [CODE[[[After_Soft_Dotted]]]]
- [CODE[[[More_Above]]]]
- [CODE[[[Before_Dot]]]]
- [CODE[[[After_I]]]]
]FIG]

[23] これらの定義は [[Unicode Standard]] 本体に規定があります。どの[[文字]]がどのように変換されるかは
[[SpecialCasing.txt]] (>>7) にあります。

* 関連

[26] [[Unicode Standard]] は他に[[正規化]]を伴う[[比較]]として[[正準無case一致]]、
[[互換性無case一致]]、[[識別子無case一致]]を定義しています。

[34] [[識別子文字]], 
[[ファイル名]]も参照。

* メモ

[27] [CITE@EN[XPath and XQuery Functions and Operators 3.0]]
( ([TIME[2014-04-08 07:02:07 +09:00]] 版))
<http://www.w3.org/TR/xpath-functions-3/#func-upper-case>

[30] [CITE@EN[XPath and XQuery Functions and Operators 3.1]]
([TIME[2017-03-21 16:02:06 +09:00]])
<https://www.w3.org/TR/2017/REC-xpath-functions-31-20170321/#func-lang>