[7] [DFN[[[Unicode Character Database]]]] は、 [[Unicode]] の[[文字]]に関するデータを集めた[[データベース]]です。
[[Unicode]] の仕様の一部を構成する[[規定]]のデータと、それ以外の[[参考]]のデータが共に含まれています。
[[UCD]] は [[Unicode Consortium]] により管理、配布されていて、 [[Unicode]] 本体と連動して改訂されています。

[8] 現代の[[言語]]や[[プロトコル]]の多くは、利用可能な[[文字]]の定義や[[正規化]]・[[照合順序]]などの[[アルゴリズム]]で利用するデータとして、
直接的または間接的に [[UCD]] のデータを参照しています。最近の多くの [[OS]] や[[プログラミング言語]]の実行環境には
[[UCD]] やそこから派生したデータが含まれています。

* 仕様書

[REFS[

- [444] 
[CITE[[[The Unicode Standard]], Version 13.0 - ch23.pdf]], [TIME[2020-03-09T17:53:52.000Z]], [TIME[2020-12-17T05:54:04.634Z]] <https://www.unicode.org/versions/latest/ch23.pdf#G19184>
-[4] [CITE@en-us[UAX #44: Unicode Character Database]]
( ([TIME[2013-09-27 22:15:15 +09:00]] 版))
<https://www.unicode.org/reports/tr44/>
-- [22] <https://www.unicode.org/reports/tr44/#Simple_Derived>
-- [30] <https://www.unicode.org/reports/tr44/#Release_Stability>
-- [40] <https://www.unicode.org/reports/tr44/#Data_File_Comments>
-- [41] <https://www.unicode.org/reports/tr44/#Obsolete>
-- [44] <https://www.unicode.org/reports/tr44/#UCD_Files>
--- [45] <https://www.unicode.org/reports/tr44/#Format_Conventions>
--- [75] <https://www.unicode.org/reports/tr44/#Default_Values_Table>
--- [76] <https://www.unicode.org/reports/tr44/#Complex_Default_Values>
-- [82] <https://www.unicode.org/reports/tr44/#File_List>
-- [84] <https://www.unicode.org/reports/tr44/#About_Property_Table>
-- [118] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2022-09-02T19:25:20.000Z]], [TIME[2022-11-13T06:02:22.216Z]] <https://www.unicode.org/reports/tr44/#Property_Values_As_Sets>
-- [98] <https://www.unicode.org/reports/tr44/#Property_And_Value_Aliases>
-- [73] <https://www.unicode.org/reports/tr44/#Matching_Rules>
-- [100] <https://www.unicode.org/reports/tr44/#Property_Invariants>
-[5] [CITE@en-us[Unicode Character Database]]
( ([TIME[2013-06-04 18:08:12 +09:00]] 版))
<http://www.unicode.org/ucd/>
-[6] [CITE[Index of /Public/UCD/latest/ucd]]
( ([TIME[2013-10-30 14:15:11 +09:00]] 版))
<http://www.unicode.org/Public/UCD/latest/ucd/>
-- [1] ([TIME[2015-02-19 03:10:35 +09:00]] 版) <http://www.unicode.org/Public/UCD/latest/ucd/PropertyAliases.txt>
-- [105] 
[TIME[2022-08-06T00:13:22.000Z]], [TIME[2022-11-12T07:27:34.688Z]] <https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt>

]REFS]


* 特性

[11] [[Unicode Standard]] および [[Unicode Character Database]] では、[[文字]]に関するデータを[[文字]] ([[符号位置]])
の[DFN[[RUBYB[[RUBYB[[RUBY[特][とく]][RUBY[性][せい]]][プロパティー]]]@en[property]]]]と呼んでいます。

[21] 
[[特性]]にはそれぞれ [CODE@en[[[General_Category]]]]
や [CODE@en[Age][Age (Unicode)]] のような名前がついています。
[[特性]]の名前は最低1つありますが、
別名が定義されているものもあります [SRC[>>98]]。
[SEE[ >>121 ]]

[EG[
[2] 例えば [CODE[Bidi_Mirroring_Glyph]] には
[CODE[bmg]] という略称があり、
関連する文書で使われることがある他、
別名リストにも掲載されています [SRC[>>1]]。
]EG]



[FIG(short list)[ [19] [[UCD]] の[[特性]]
- [CODE[Age][Age (Unicode)]]
- [CODE[Bidi_Class]]
- [CODE[Bidi_Mirrored]]
- [CODE[Canonical_Combining_Class]]
- [CODE[General_Category]]
- [CODE[Deprecated]]
- [CODE[IDS_Unary_Operator]]
- [CODE[IDS_Binary_Operator]]
- [CODE[IDS_Trinary_Operator]]
- [CODE[Script][Script (UCD)]]
- [CODE[Script_Extensions]]
- [CODE[Soft_Dotted]]
- [CODE[Quick_Check]]
- [CODE[Decomposition_Type]]
- [CODE[Grapheme_Base]]
- [CODE[Grapheme_Extend]]
- [CODE[Joining_Type]]
- [CODE[Prepended_Concatenation_Mark]]

]FIG]

;; [104] [[Unihan]] も参照。

[85] 
[[特性]]は[[規定]]
([DFN[N]], [DFN[Normative]]),
[[参考]]
([DFN[I]], [DFN[Informative]]),
[DFN[Contributory]]
([DFN[C]]),
予備的
([DFN[P]], [DFN[Provisional]])
に分類されています
[SRC[>>84]]。
もっとも実用上はこの違いは然程重要ではありません。

[12] [[文字]]と[[特性]]のデータは >>9 の各ファイルに含まれています。どのように記述されているかはそれぞれの[[特性]]により異なり、
[[UAX #44]]
[SRC[>>4]]
などに説明があります。

[37] 
[[特性]]とその利用法については、
[CITE[Unicode Standard]] 本体、
[[UCD]] の [[UAX #44]]、
[[UCD]] の各ファイル、
参照している各 [[UAX]]/[[UTS]]
に分散して記述されています。
あちこちに情報が少しずつあって、
しかも相互の[[リンク]]が不十分なので、
苦労することも多いです。


-*-*-

[86] 
[[特性]]は[[単純特性]]と[[派生特性]]に分けられます。

-[23] 
[DFN[[RUBYB[単純特性][simple property]]]]は、
他の[[特性]]から計算できない[[特性]]です [SRC[>>22]]。
-
[24] 
[DFN[[RUBYB[派生特性][derived property]]]]は、
他の[[特性]]から一定の規則で導出される[[特性]]です [SRC[>>22]]。

[26] 
[[単純特性]]と[[派生特性]]の違いは、
その[[特性]]が[[規定]]であるか[[参考]]であるかとは無関係です。
[[特性]]の重要度とも関係しません。

[25] 
[DFN[contributory properties]]
は、
[[単純特性]]のうち、
[[派生特性]]の規則の記述を簡潔にしたり一般化したりするために敢えて設けられたものです。
例外リストの記述の便法として使ったり、
重要な[[派生特性]]の安定性の保証に関係して使ったりされます。
[SRC[>>22]]

[28] 
[[派生特性]]の導出方法は、
[[UCD]]
の各ファイルに注釈として説明がありますが、
改訂されることがあります [SRC[>>22]]。
注釈の説明は[[参考]]です [SRC[>>40]]。
導出方法と示された特性値が矛盾する場合、
示された特性値の方が[[規定]]と解釈される[RUBYB[べき][should]]です [SRC[>>22]]。
実装は、誤りを防ぐため、[[単純特性]]から[[派生特性]]を導出するのではなく、
直接[[派生特性]]を使う[RUBYB[べき][should]]です [SRC[>>22]]。

;; [27] つまり[[単純特性]]と[[派生特性]]の違いは、
仕様 ([[Unicode]] 自体や、それを使う[[プロトコル]]) 
を検討する人達には意味があっても、
[[Unicode]]
を実装する人達や、
[[Unicode]]
を実装した[[プログラム]]や
[[Unicode]]
を使った[[プロトコル]]を使う人達には重要ではありません。

[115] 
[[Unicode符号点]]はただでさえ
[ [CODE[U+0000]], [CODE[U+10FFFF]] ]
という大きな[[集合]]なので、
[[特性値]]を他の[[特性値]]の組み合わせで記述できるなら、
それで保存データ量を削減したいと思ってしまいます。
しかし実際[[派生特性]]の計算はかなり複雑だったりしますから、
素直に公式データをそのまま使った方が安全です。


[HISTORY[
[29] 
[[Unicode 10.0]] から
[[Unicode 12.1]]
まで、
[[segmentation]]
関係の特性が外部
([[UCD]] 以外)
の仕様の特定の版に依存する形で定義されていました。
[[UAX #14]], [[UAX #29]], [[UTS #51]]
で説明されていました。
[[Unicode 13.0]]
から
[[UCD]]
だけで完結するように改められました。
[SRC[>>22]]
]HISTORY]


* 特性値

[87] 
[[特性]]は値により次のように分類されています。
[SRC[>>84]]

- [88] [DFN[[RUBYB[カタログ][Catalog]]]] ([DFN[C]]) 特性は、
列挙値のいずれかを取る特性です。
列挙値は
[[Unicode]]
の改訂で順次追加されていくことが予期されています。
[SRC[>>84]]
-- [69] ファイルで省略されていたときの[[既定値]]は、
ファイルの[[コメント]]で説明されます。
[SRC[>>45]]
- [89] [DFN[[RUBYB[列挙][Enumeration]]]] ([DFN[E]]) 特性は、
列挙値のいずれかを取る特性です。
通常は新しい値が追加されることはありません。
[SRC[>>84]]
-- [96] ファイルで省略されていたときの[[既定値]]は、
ファイルの[[コメント]]で説明されます。
[SRC[>>45]]
--
[35] 
[[列挙特性]]の特性値の中には、どの[[符号位置]]でも使用されていないものが含まれる場合もあります。
過去の版で使用されていたものが、
使用されなくなったことがあります。
[SRC[>>30]]
- [90] [DFN[[RUBY[二値][バイナリー][Binary]]]] ([DFN[B]]) 特性は、
[[真]] ([DFN[Y]], [DFN[Yes]], [DFN[True]]) と[[偽]] ([DFN[N]], [DFN[No]], [DFN[False]])
の2値の特殊な[[列挙]]特性です。
[SRC[>>84]]
-- [71] 
ファイルでは[[真]]を表すために[[特性]]名を書きます [SRC[>>45]]。
-- [95] 
ファイルで省略されていたときの[[既定値]]は、[[偽]]です。
ファイルでは[[偽]]を記述せず、必ず省略します。
(ただし [CODE[Extended_Pictographic]] は例外です。) [SRC[>>45]]
- [91] [DFN[[RUBYB[文字列][String]]]] ([DFN[S]]) 特性は、
通常は
[[Unicode]] [[符号位置]]から他の[[符号位置]]またはその[[列][文字列]]への[[写像]]です。
[SRC[>>84]]
-- [94] ファイルで省略されていたときの[[既定値]]は、
その[[符号位置]]自身です [SRC[>>45]]。
- [92] [DFN[[RUBYB[数値][Numeric]]]] ([DFN[N]]) 特性は、
[[数字]]関連の[[文字]]に[[数値]]を指定する特性です。
[SRC[>>84]]
-- [99] 値の[[一致]]は[[数値]]として行われます (>>141)。
- [93] [DFN[[RUBYB[その他][Miscellaneous]]]] ([DFN[M]]) 特性は、
他の種類に収まらない特性です。 [SRC[>>84]]
-- [119] 複数の異なる値の[[順序]]のない[[集合]]のことがあります. [SRC[>>118]]
--- [109] 例えば [CODE[Script_Extensions]] の値は[[集合]]です。
-- [120] 複数の値の[[順序]]のある[[並び]]のことがあります. [SRC[>>118]]
--
[72] [RUBYB[その他][miscellaneous]]特性で値が[[文字列]]となるものでは、
ファイルで省略されていたときの[[既定値]]は
[[null]] [[文字列]]です。
[SRC[>>45]]

;; [150] この[[特性値]]の[[データ型]]は [CODE[\p]] では少し違うので注意.

-*-*-

[116] 
ほとんどの[[特性]]には[[既定値]]が決められていて、
[[ファイル]]で省略されているときはその[[既定値]]が[[特性値]]となります。
[[既定値]]は [[UCD]] の[[ファイル]]の解釈に使うためのもので、
[[特性]]を使う処理の性質とは必ずしも関係ありません。

[74] [[既定値]]は[[ファイル]]の[[コメント]]の
[CODE[@missing]]
行に[[機械可読]]に書かれることがあります。 [SRC[>>45]]
いくつかの[[特性]]の[[既定値]]は例外的なものや複雑な方法で決定されるもので、
個別に説明があります
[SRC[>>75, >>76]]。

[77] 
[[既定値]]を表す
[DFN[[CODE[@missing]]]]
は、

[PRE(code)[
# @missing: 0000..10FFFF; <none>
]PRE]

... のように、 [CODE[# [[@missing]]:]]
の後に[[欄]]が続きます。
第0欄が適用対象の[[符号位置]] (の範囲)、
第1欄が特性値を表します。
[SRC[>>45]]

[78] 
ただし、一部のファイルには複数の[[特性]]が書かれているため、
第1欄が[[特性]]名、
第2欄が特性値を表します。
[SRC[>>45]]

[79] 
値には、 
special tag
が使われることがあります。
[DFN[[CODE[<node>]]]]
は[[空文字列]]、
[DFN[[CODE[<code point>]]]]
は[[符号位置]]の値の[[文字列]]表現、
[DFN[[CODE[<script>]]]]
は[[符号位置]]の
[CODE[Script]]
特性値を表します。
[SRC[>>45]]

-*-*-

[97] 
値には、
別名が定義されていることもあります [SRC[>>98]]。
各仕様書などで使われることがあります。
(>>122)


* 私用文字

[102] 
[[私用域]]の[[符号位置]]にも、
他の[[符号位置]]と同じように[[特性][文字特性]]値が決められています。

[490] 
[[Unicode]]
の多くの[[アルゴリズム]]は、
[CODE[General_Category]]
やそれから[[派生]]した[[特性]]を参照しています。
[[私用文字]]に関するその[[特性]]値は、
特に禁じた場合を除き、
[[私的な同意]]に基づき上書きして設定できます。
[SRC[>>444]]

[491] 
その他の[[特性][文字特性]]についても、
[[正規化]]に関係するものを除き、
[[UCD]]
で定められた[[特性]]値は[[既定値]]であって、
[[参考]]とします。
この[[既定値]]は、
典型的な用例に基づき決められたもので、
[[私的な同意]]なき場合の一貫した挙動を定めることと、
一般的な利用を簡単化することを意図したものであります。
実装は、その[[私用]]に関する要件に従い適宜変更・上書きして構いません。
[SRC[>>444]]

[EG[
[492] 
[[私的な同意]]に基づき[[大文字と小文字の関係][case mapping]]を設定したり、
[[結合文字]]として使うことにしたりできます。
[SRC[>>444]]
]EG]

[4100] 
[[NFC]]
など
[[Unicode]]
で規定された[[正規化]]は、
[[私用文字]]を変化させません。
[[私的な同意]]があってもこの挙動を変化させてはなりません。
(もちろん独自の[[正規化]]手法を採用する場合はこの限りではありません。)
[SRC[>>444]]

-*-*-

[4101] 
[[特性値]]をどの程度変更しても良いかについて、
[CITE[The Unicode Standard]]
は特に言及していません。
しかし
[[Unicode]]
で規定される各[[アルゴリズム]]や、
[[特性値]]を参照するそれ以外の[[仕様書]]の[[規定]]、
[[特性値]]を参照する[[アプリケーション]]固有の挙動などは、
必ずしもあらゆる[[特性値]]の組み合わせを扱えるわけではありません。
他のどの
[[Unicode文字]]でも起こり得ない組み合わせに対する挙動は想定されていない可能性があります。
仕様上は想定されていても、実装上は除去して最適化されていることがあり得ます。

[4102] 
とりわけ、
他の[[特性値]]から[[導出]]されるいくつかの[[特性値]]を扱う[[アルゴリズム]]は、
各[[特性値]]の一貫性を前提にしているかもしれません。
[[導出]]は [[Unicode]] の[[仕様書]]上の概念に過ぎず、
実装上は一方から他方が計算されるとは限りません [SEE[ [[特性][文字特性]] ]]。

[4103] 
[[特性][文字特性]]は既に相当数規定されている上に、
[[Unicode]]
の改正のたびにどんどん追加されています。
[[私用文字]]のそれぞれについて、
すべての[[特性]]を適切な値に保ち続けるのは困難です。

[4104] 
そう考えると、
[[私用文字]]の定義の時に[[特性]]を1つ1つ設定していく方法より、
予め用意した[[特性値]]の組み合わせの中から適当なものを1つ選択する方法の方が、
現実的な実装手段ではないでしょうか。
「予め用意した[[特性値]]の組み合わせ」
も、
新たに独自に用意するよりは、
既存の
[[Unicode符号位置]]を1つ選ぶことで記述するとした方が簡単そうです。
既存のどの
[[Unicode符号位置]]とも[[特性][文字特性]]が一致しない[[私用文字]]を使いたい可能性は、
それほど高くないでしょうから、
多くの利用はカバーできそうです。

[4105] 
例えば[[アルファベット]]系の[[外字]]なら「[CODE[A]]」、
[[漢字]]系の[[外字]]なら「[CODE[一]]」
のように性質の似た既存の[[文字]]を選ぶ形にすればいいということです。

[4106] 
ただしこの手法でも、
[[大文字]]・[[小文字]]の変換の[[特性値]]や
[[Unihan]] 系の[[特性値]]など、
すべての[[特性値]]を丸々コピーするわけにはいきません。

-*-*-

[4108] 
[[アプリケーション]]によっては、
[[相互運用性]]のため、
[[私用文字]]が使えたとしても[[特性値]]の変更までは認めない、
または特定の場面では[[特性値]]の変更を関知しないような制限があるかもしれません。

[4109] 
例えば[[正規表現]]の [CODE[\p]] は[[特性値]]によって[[文字]]の[[一致]]を判定します。
[[ネットワーク]]で配布する条件記述ファイル中に含める[[正規表現]]で、
[[一致]]するか否かが変わると[[相互運用性]]に支障が出るまら、
必ず [[UCD]] の[[特性値]]通りに動作すると定めるべきでしょう。

[4110] 逆に、テキスト編集アプリケーションで、
選択した[[文字列]]の[[大文字]]を[[小文字]]に変換する[[ボタン]]なら、
[[相互運用性]]には支障がなさそうですから、
[[利用者]]の便宜を優先するのが良さそうです。

-*-*-


[4113] 
関連して[[非文字]]の場合については、[[非文字]]参照。

* 非Unicode文字

[157] 
[[Unicode]] は [[Unicode符号位置]]について規定していますが、
それ以外については規定していません。しかし実際には、

- [158] [[Unicode]] 以外の[[文字コード]]の[[文字]]や[[符号位置]]
- [159] [[文字コード]]以外の方法で記述された[[文字]]や[[文字]]と同等の[[オブジェクト]]

が存在しています。現代においては [[Unicode]] をまったく無視したシステムは非現実的なので、
多かれ少なかれ [[Unicode]] の[[文字特性]]を活用することになりますが、
その場合の [[Unicode]] 以外との接続が問題となります。

- [161] [[Unicode]] 以外の[[文字コード]]のうち、
[[Unicode文字]]と対応関係が定まっているものは、
対応する[[Unicode符号位置]]の[[特性]]を準用すれば十分のことが多いと思われます。
- [162] [[Unicode]] 以外の[[文字コード]]のうち、
未割当の[[符号位置]]は、
[[Unicode]] の[[未割当符号位置]]の[[特性]]を準用するのがいいと思われますが、
どの[[符号位置]]の性質に近いか判断が必要となるかもしれません。
- [163] [[Unicode]] 以外の[[文字コード]]にあって [[Unicode]] 
に相当する[[文字]]がないものは、
個別に検討が必要です。
- [164] 
[CC[U-00110000]] [[以上]]の[[符号位置]]は、
[[PUP]] は[[私用文字]]、それ以外は[[非文字]]の[[特性]]を準用するのがいいと思われます。
- [4107] 
[[マーク付け言語]]や[[プロトコル]]に依存した、
[[Unicode符号位置]]以外の方法で[[外字]]を表現・交換することもあります
[SEE[ [[外字]] ]]。
-- [160] 
そのような[[外字]]も、
[[Unicode]]
の[[私用文字]]と同様に、
自然に扱うためには適切な[[特性値]]の情報が与えられていなければなりません。
--
[4111] 
それに対応した交換形式は
[CITE[[[Missing Characters in XML]]]]
くらいしか見たことがありません。
しかしこの提案はほとんど使われていないようです。
- [165] 
[[文字]]以外の[[オブジェクト]]は、
その性質に応じて個別に検討が必要になります。



* 別名

[123] 
[[UCD]] の[[特性]]やその値には、大量の[DFN[[RUBYB[[RUBY[別][べつ]][RUBY[名][めい]]][alias]]]]があります。

- [121] 
[DFN[[CODE[PropertyAliases.txt]]]] には、
[[特性]]の別名が収録されています [SRC[>>1, >>98]]。
-- [135] 
第1欄が[RUBYB[省略された記号名][abbreviated symbolic name]]、
第2欄が[RUBYB[長い記号名][long symbolic name]] (公式な名前) で、
その2つが[RUBYB[好ましい別名][preferred alias]]とされます。
第3欄以後はその他の[[別名]]です。
[SRC[>>98]]
-
[122] 
[DFN[[CODE[PropertyValueAliases.txt]]]] には、
[[特性値]]の別名が収録されています [SRC[>>105]]。
-- [136] 
第2欄が[RUBYB[省略された記号名][abbreviated symbolic name]]、
第3欄が[RUBYB[長い記号名][long symbolic name]] (公式な名前) で、
その2つが[RUBYB[好ましい別名][preferred alias]]とされます。
第4欄以後はその他の[[別名]]です。
[SRC[>>98]]
--- [137] [CODE[Canonical_Combining_Class]] は例外で、
省略名の前に数値名が入ります。
[SRC[>>98]]
-- [139] 古い [[UCD]] では
[CODE[Age]],
[CODE[Block]],
[CODE[Joining_Group]]
に該当なしを表す特殊値
[DFN[[CODE[n/a]]]]
がありました。現在は使われていません。
[SRC[>>98]]
- [140] 
省略名と長い名前が同じこともあります。 [SRC[>>98]]

[126] [[別名]]には次のような構文上の要件があります。 [SRC[>>98]]
オリジナルの[[特性]]や[[特性値]]については明言されていませんが、
それらも等しく“[[別名]]”であるとして同じ規則が適用されるものと思われます。

- [128] [[ASCII英数字]]、[CODE[_]] のみを使います。 [SRC[>>98]]
- [127] [[別名]]の[[比較]]では[[大文字と小文字]]の違いは重要ではありません。 [SRC[>>98]]
-- [129] つまり[[大文字と小文字]]の違いだけをもって異なる意味が割り当てられることがないということです。

[125] 
[[特性]]や[[特性値]]の[[一致]]には、
[[別名]]も考慮する[RUBYB[べき][should]]です
[SRC[>>98]]。

[138] 
[[特性]]の[[別名]]は、それが1つの[[名前空間]]となります。
[[特性値]]の[[別名]]は、各[[特性]]が1つの[[名前空間]]となります。
[SRC[>>98]]

;; [151] 
[[Unicode正規表現]]の [CODE[\p]]
においては、[[二値特性]]の名前を記述するべき欄に特例で
[CODE[General_Category]]
と
[CODE[Script]]
の[[特性値]]を記述できます。
[SEE[ [[\p]] ]]
ということは将来にわたってこれらが衝突しないことが望まれますが、
それが保証されているのかどうかは定かではありません。

;; [155] 
[[Unicode正規表現]]の [CODE[\p]]
においては、
[[特性]]の名前として
[[UCD特性]]の他にもいくつかの値が指定できます。
また、特別な意味を持つ 
[CODE[identity]]
という値も指定できることがあります。


[106] 
先頭の [CODE[is]] の有無 (>>148)
だけの違いで[[別名]]の解釈が変わることもありません。
[SRC[>>73]]

[107] 
別名は他の値と互いに等価です。
[[UCD]] の各ファイルにはオリジナルの値が使われていることもあれば、
別名が使われていることもあります。
[[UCD]] を読み取る実装はすべての値に対応する必要があります。
[[UCD]] の[[特性]]を使う実装も、普通はすべての値に対応する必要があります。

[EG[
[108] [[正規表現]]の [CODE[\p]] で[[UCD]]の[[特性名]]や[[特性値]]に[[別名]]も区別なく使えます。
]EG]

;; [117] 具体的には各[[特性]]の項を参照。

[131] 
[[プラットフォーム]]に応じて[[別名]]を変換したり、
他の[[別名]]を追加したりしても構いません。
しかしながら、
[[データ形式]]等では[[相互運用性]]のため
[[UCD]] の[[別名]]を使うことが推奨されます。
[SRC[>>98]]

;; [132] [[プラットフォーム]]の慣習に応じて [CODE[_]] を [CODE[-]]
に置き換えたり、 [[CamelCase]] にしたり、
といった変形があっても差し支えないようです。

[156] 
[[Perl]] の[[正規表現]] [CODE[\p]] における [CODE[General_Category]]
では、
[[UCD]] の[[別名]]に加えて [CODE[L&]] が使えます。
[SEE[ [[General_Category]] ]]

** 別名の比較

[124] 
[[特性]]や[[特性値]]の[[別名]] ([RUBYB[記号値][symbolic value]])
の[[一致]] ([[等価性]]) は、
次によります。
[SRC[>>73 UAX44-LM3]]

- [146] [[大文字と小文字]]の違いは無視します。 [SRC[>>98, >>73]]
- [147] [[空白]]、[[下線]] [CODE[_]]、[[ハイフン]]は無視します。 [SRC[>>73]]
- [148] [[接頭辞]] [CODE[is]] (たかだか1つ) は無視します。 [SRC[>>73]]


;; [130] [[UCD]] データファイルでは長い[[別名]]は [[titlecase]]
が[RUBYB[好ましい][preferred form]]とされています。 [SRC[>>98]]
[[引用]]等では [[UCD]] データファイル中の表記を踏襲するのが望ましいと思われます。

[149] 
なお、 [CODE[Line_Break]] に [CODE[IS]] がありますが、
値全体であって[[接頭辞]]ではないこと、
null value (ここでは[[空文字列]]のことか) 
は有効な値ではないことに注意されています。
[SRC[>>73]]

[152] 
[[Unicode正規表現]]の [CODE[\p]] では、
この[[一致]]によることが推奨または要求されます。
ただし、
[CODE[is]] を無視する件は要求されないことがあります。
[SEE[ [[\p]] ]]

[153] 
[CODE[\p]] では[[特性値]]を[[ワイルドカード]]比較できます。
このとき無視は行われず、元の値と比較されます。
[SEE[ [[\p]] ]]
ということはその実装に使う [[UCD]] のデータの保存は、
無視による同一化を前提とした最適化を行えないということになります。

;; [154] 厳密には [[Unicode正規表現]]は必ずしも [[UCD]]
のオリジナルの[[特性値]]そのものに対する一致を判定することを要求してはいないと読めますから、
最適化しても[[実装]]の[[適合性]]には影響しないのでしょうが、
[[正規表現]]の[[実装]]の[[相互運用性]]と[[利用者]] ([[正規表現]]を書く[[開発者]])
の驚き最小化のためには、各[[実装]]の勝手な最適化が可視化されるべきではなさそうです。



** 別名の安定性

[134] 
通常の[[別名]]は[[安定性]]が保証されています。 [SRC[>>98]]
改訂によって変更・削除されることがありません。

[133] 
ただし、
[[予備的特性]]や予備的データファイルについても[[別名]]は設定されることがありますが、
[[安定性]]は保証されません。
[SRC[>>98]]

* 数値の比較

[141] 
[[数値特性]]の[[特性値]]の[[一致]]は、
[RUBYB[[[数値]]としての等価性][numeric equivalence]]によります。
[SRC[>>73 UAX44-LM1]]。

[EG[

[142] 
"01.00" と "1" は等価です。
[SRC[>>73]]

]EG]

[EG[

[143] 
[[UCD]] の "1.666667" は[[循環小数]]を表し、
"10/6" や "5/3"
と等価です。
[SRC[>>73]]

]EG]

;; [144] 例示だけで具体的な[[比較]]の方法は定められていません。

* 文字の名前の比較

[145] [[文字の名前]]を表す [CODE[Name]] の[[一致]]は、
特にその方法が規定されています。
[SRC[>>73 UAX44-LM2]]
[SEE[ [[文字の名前]] ]]

* Unicode の版

[13] [[UCD]] は [[Unicode]] が改版される度に併せて改訂されています。特に小改訂は [[UCD]]
の更新が主目的であることもあります。

[14] [[Unicode]] の版によって値が変化する(可能性のある)[[特性]]もあれば、
不変であることが保証されている[[特性]]もあります。[[特性]]自体も改版により増えたり、減ったりしています。

[15] >>8 の通り、多くの言語やプロトコルには何らかの形で [[UCD]] のデータや [[Unicode]]
の[[演算]]の実装が含まれています。それぞれが対応している [[Unicode]] の版に違いがあると、
正しくない結果が得られる可能性もあります。

[31] 
[[UCD]]
のある特定の版は、
[RUBYB[[[安定]]][stable]]であって、出版後変更されることがありません [SRC[>>30]]。
誤りは Errata で公表され、必要に応じて次の版で修正されます [SRC[>>30]]。
しかしその特定の版のファイル自体は変更されません。

[32] 
[[UCD]]
は、
[[Unicode]]
の
[[Webサイト]]で版ごとに公開されています。
この [[URL]]
は[[安定]]で、
恒久的に提供されるとされています。 [SRC[>>30]]
[[UCD]]
の各ファイルは
[[Webサイト]]から誰でも無償で入手可能です。

[42] 
版が指定されない、最新版の 
[[UCD]]
にアクセスできる
[[URL]]
もあります
[SRC[>>6]]。
[[UCD]]
を使った[[プログラム]]のための元データとして取得するときは、
この 
[[URL]] 
を使うのが便利です。


[33] 
(版をまたいだ) [[特性]]の[[安定性]]は、
[CITE[Unicode Consortium Stability Policies]]
にまとめられています。 [SRC[>>30]]
[[UAX #44]]
で変更しないと定められているものもあります [SRC[>>100]]。
一度決めた値が変更されることはない[[特性]]もあれば、
変更される可能性があるものもあります。

[EG[
[34] 
[CODE[U+200B]]
[CODE(charname)@en[ZERO WIDTH SPACE]]
の
[CODE[General_Category]]
は、
[CODE[Zs]]
から
[CODE[Cf]]
に改正されました。
[SRC[>>30]]


]EG]

;; [114] 具体的には各[[特性]]の項を参照。

[36] 
[[特性]]は、
[RUBYB[[[廃止]]][obsolete]]されることがあります [SRC[>>30]]。
廃止特性は、
重ねて[RUBYB[[[非推奨]]][deprecated]]や[RUBYB[[[安定化]]][stabilized]]されることがあります
[SRC[>>30]]。
状況の変化によって不要となったものが指定されるようです。
ただし[[特性]]自体は削除されることはない [SRC[>>30]]
とされ、恒久的に残されるようです。

[39] 
[[非推奨]]の[[特性]]は、
使うべきではありません [SRC[>>30]]。
;; [101] [CODE[Deprecated]] という名前の特性もありますが、また別です。

[38] 
[[安定化]]された[[特性]]は、
値が凍結されて以後メンテナンスされません [SRC[>>30]]。

[43] 
[[UCD]]
に含まれる説明の [CODE[.html]]
ファイルは、
廃止されることがあります
[SRC[>>41]]。
廃止されると新しい版の
[[UCD]]
にはファイル自体が含まれなくなるようです。







* UCD のライセンス

[17] [[UCD]] のデータは [[EXHIBIT 1 UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE]]
の対象となっています。示された条件に従う限り、[[ソフトウェア]]への組み込みなど自由に利用できるようです。


* ファイル

[9] [[UCD]] のデータは[[テキストファイル]]として提供されています。その書式はファイルにより異なり、
[[UAX #44]]
[SRC[>>4]] 
で説明されています。

[FIG(list middle)[
[FIGCAPTION[
[10] [[UCD]] の主なファイル
]FIGCAPTION]

- [[UnicodeData.txt]]
- [CODE[NamesList.txt]]
- [CODE[NamesList.html]]
- [[CaseFolding.txt]]
- [[PropList.txt]]
- [CODE[PropertyAliases.txt]]
- [CODE[CompositionExclusions.txt]]
- [CODE[DerivedBinaryProperties.txt]]
- [CODE[BidiMirroring.txt]]
- [CODE[BidiBrackets.txt]]
- [CODE[StandardizedVariants.txt]]
- [CODE[Jamo.txt]]
- [CODE[DerivedAge.txt]]
- [CODE[DerivedCombiningClass.txt]]
- [CODE[DerivedDecompositionType.txt]]
- [CODE[ArabicShaping.txt]]
- [CODE[DerivedJoiningGroup.txt]]
- [CODE[DerivedJoiningType.txt]]
- [CODE[Blocks.txt]]
- [CODE[PropertyValueAliases.txt]]
- [CODE[ScriptExtensions.txt]]
- [CODE[Scripts.txt]]
- [CODE[USourceData.txt]]

[HISTORY[
- [CODE[StandardizedVariants.html]]
]HISTORY]


]FIG]


[FIG(short list)[ [103] [[UCD]] 外の同様のファイル
- [CODE[emoji-variation-sequences.txt]]
- [CODE[IVD_Collections.txt]]
- [CODE[IVD_Sequences.txt]]
]FIG]


[83] 
これらの[[ファイル]]の多くは[[文字]]の[[特性]]を記述したものですが、
それ以外のものもあります。
[[特性]]以外の各[[ファイル]]は[[規定]]
([DFN[N]], [DFN[Normative]]),
[[参考]]
([DFN[I]], [DFN[Informative]]),
予備的
([DFN[P]], [DFN[Provisional]])
に分類されています
[SRC[>>82]]。
[[特性]]にもそれぞれの状態が定められています (>>85)。
もっともこの分類は[[仕様書]]としての形式的なもので、
実用上気にする場面はありません。


[46] 
比較的古いファイルは独特の形式で、
比較的新しいファイルはできるだけ共通の形式を採用しているようです。
[[ファイル]]と[[特性]]の関係に規則性はなく、
個別に調べていくしかありません。
1つの[[ファイル]]で複数の[[特性]]が定義されていることがあります。

[47] 
多くのファイルは次のような構造をしています。
[SRC[>>45]]

- [48] [[UTF-8]] です。
- [49] [CODE(charname)@en[LF]] 区切りの[[行]]指向のファイルです。
- [50] [CODE[#]] から行末までは[[コメント]]です。
[[構文解析]]時にまず除去します。
- [51] 各[[行]]は、 [CODE[;]] で区切られた[RUBYB[欄][field]]で構成されます。
[[0起算]]で数えます。
- [54] 欄の先頭と末尾の[[空白]]は、意味を持ちません。除去して解釈します。
(ただし、古めのファイルには例外あり。)
- [67] 欄の値は、
複数の値の[[間隔]]区切りのリストとなっていることがあります。
値の順序に意味があることも、ないこともあります。
- [81] 欄の値が空になることがあります。
意味はファイルにより異なります。
- [52] 第0欄は[[符号位置]]またはその範囲を表します。
- [53] 第1欄は第0欄の[[符号位置]]についての情報を表します。
- [70] 特性値が[RUBYB[[[既定値]]][default value]]と同じとき、その[[符号位置]]の記述は省略できます。

[65] [[コメント]]には、
行頭に [CODE[#]] があって[[欄]]がないものもあります。
ファイルの先頭にはファイル情報が書かれています。
[[派生特性]]はその導出方法が書かれています (>>28)。
[[既定値]]についての説明が書かれていることもあります
(>>74)。
[CODE[@missing]] 
は[[構文解析]]して使えることになっています。

[66] 
[[欄]]の後に[[コメント]]が続くこともあります。
一定の書式で参考になる情報が書かれている場合もあります [SRC[>>45]]。
しかしあくまで参考であって、
変更されることもあり得るので、
[[構文解析]]して使う[RUBYB[べき][should]]ではありません [SRC[>>45]]。

-*-*-

[68] 第0欄には[[符号位置]]またはその範囲が指定されます。
また特性の値に[[符号位置]]が指定されることがあります。
次のように記述されます [SRC[>>45]]。

- [55] [[符号位置]]は、4桁から6桁の[[16進数]]列で表します。
([CODE[U+]] はつけません。)
- [56] [[符号位置]]の[[列][文字列]]は、
[[符号位置]]の[[間隔]]区切りで表します。
- [57] [[符号位置]]の範囲は、先頭と末尾の[[符号位置]]を
[CODE[..]] で連結して表します。

-*-*-

[166] 
[CITE@en[GitHub - unicode-org/unicodetools: home of unicodetools and https://util.unicode.org JSPs · GitHub]], [TIME[2026-03-19T09:49:36.000Z]] <https://github.com/unicode-org/unicodetools>


** [CODE[UnicodeData.txt]]

[58] [DFN[[CODE[UnicodeData.txt]]]]
は、
[[UCD]]
のファイルの1つです。
古くからある基礎的な[[特性][特性 (UCD)]]が記述されています。

[REFS[
- [59] <http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt>
]REFS]

[60] [CODE[UnicodeData.txt]] のデータは他のファイルにも含まれていて、
そちらの方が使いやすいかもしれません。

,*欄#,*値          ,*他のファイル
,0,[[符号位置]]
,1,[[Name]] ([[文字名称]])                                ,[[NamesList.txt]]
,2,[[General_Category]]                                   ,[[DerivedGeneralCategory.txt]]
,3,[[Canonical_Combining_Class]]                          ,[[DerivedCombiningClass.txt]]
,4,[[Bidi_Class]]                                         ,[[DerivedBidiClass.txt]]
,5,"[[Decomposition_Type]], [[Decomposition_Mapping]]"    ,[[DerivedDecompositionType.txt]]
,6-8,"[[Numeric_Type]], [[Numeric_Value]]"                ,"[[DerivedNumericType.txt]], [[DerivedNumericValues.txt]]"
,9 ,[[Bidi_Mirrored]]                                     ,[[DerivedBinaryProperties.txt]]
,10,[[Unicode_1_Name]] (廃止)
,11,[[ISO_Comment]] (廃止)
,12,[[Simple_Uppercase_Mapping]]                          ,"[[CaseFolding.txt]], [[DerivedCoreProperties.txt]]"
,13,[[Simple_Lowercase_Mapping]]                          ,"[[CaseFolding.txt]], [[DerivedCoreProperties.txt]]"
,14,[[Simple_Titlecase_Mapping]]                          ,"[[CaseFolding.txt]], [[DerivedCoreProperties.txt]]"

[62] 
このファイルの形式は、
[[UCD]]
の新しいファイルの形式 (>>46)
と少し違うところもあります。

[63] 欄の先頭と末尾に[[間隔]]は挿入できません。 [SRC[>>45]]

[80] 欄が[[空文字列]]のとき、
既定値であることを表します。
[SRC[>>45]]

[61] [[CJK統合漢字]]や[[ハングル音節]]や[[私用域]]などは各[[符号位置]]ではなく範囲として記述されているので注意が必要です。
また、未割当の[[符号位置]]や[[非文字]]は含まれていません。

[64] この範囲の記述形式は、
新しいファイルのような [CODE[..]] を使う形式ではなく、
範囲の先頭の[[符号位置]]と、最後の[[符号位置]]の[[行]]を別々に記述する形式となっています。例えば、

[PRE(code)[
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
]PRE]

... のように [CODE[<[VAR[...]], First>]],
[CODE[<[VAR[...]], Last>]]
と書かれた2つの[[行]]で範囲であることが示されます。[SRC[>>45]]

* 文脈

[110] 
[[UCD]] やその他の[[Unicode符号点]] [WEAK[(や[[Unicode符号点]]の[[列][文字列]])]]
の[[特性]]の情報は、
[[文字のレンダリング]]をはじめ[[文字]]の各種の処理で参照されます。
具体的には各[[特性]]の項を参照。

[111] 
[[Unicode正規表現]]は [[UCD]] やその他の[[特性]]の多くにアクセスできる機能
[CODE[\p]]
を提供しています。
多くの[[プログラミング言語]]等の[[正規表現]]に組み込まれています。

[113] 
多くの[[データ形式]]や[[プロトコル]]が、[[識別子]]や[[データ]]の構文の定義のために
[[UCD]] やその他の[[特性]]を直接または間接的に参照しています。


[112] 
そうした機能の実装のために、多くの[[プラットフォーム]]や各種の[[プログラム]]が
[[UCD]] の一部または全部を組み込んで使っています。

* メモ

[16] [[符号化文字集合]]の実装のためには、[[仕様書]]本文だけでなく、含まれている各[[文字]]の詳細な情報が必要になります。
旧来の[[符号化文字集合]]は比較的小規模で性質の似た[[文字]]のみを含んでいたこともあり、
そのような情報をほとんど提供してきませんでした。 [[UCD]] 
のような形で[[機械可読]]な実装用の情報を提供する[[符号化文字集合]]は他に無く、
これが [[Unicode]] の成功の要因の1つと言えるかもしれません。
([[ISO/IEC 10646]] も単独では十分な実装が困難でしょう。)

[20] → [[ISO/IEC 10646]] も単独を諦めて、今では多くの項目が
[[Unicode]] を参照する形になっています。

[3] [CITE@en-us[UTR #23: The Unicode Character Property Model]]
([TIME[2015-05-28 05:51:30 +09:00]] 版)
<http://unicode.org/reports/tr23/>

[18] [CITE@en[Remove Unicode database version requirement · whatwg/javascript@4f1a517]]
([TIME[2016-02-19 22:53:52 +09:00]] 版)
<https://github.com/whatwg/javascript/commit/4f1a517f02bc15e934aafae0ec2b47c80786ab7f>