[7] Unicode Character Database は、 Unicode の文字に関するデータを集めたデータベースです。 Unicode の仕様の一部を構成する規定のデータと、それ以外の参考のデータが共に含まれています。 UCD は Unicode Consortium により管理、配布されていて、 Unicode 本体と連動して改訂されています。
[8] 現代の言語やプロトコルの多くは、利用可能な文字の定義や正規化・照合順序などのアルゴリズムで利用するデータとして、 直接的または間接的に UCD のデータを参照しています。最近の多くの OS やプログラミング言語の実行環境には UCD やそこから派生したデータが含まれています。
[11] Unicode Standard および Unicode Character Database では、文字に関するデータを文字 (符号位置) の特性と呼んでいます。
[21]
特性にはそれぞれ General_Category
や Age
のような名前がついています。
特性の名前は最低1つありますが、
別名が定義されているものもあります >>98。
[2] 例えば Bidi_Mirroring_Glyph
には
bmg
という略称があり、
関連する文書で使われることがある他、
別名リストにも掲載されています >>1。
[85] 特性は規定 (N, Normative), 参考 (I, Informative), Contributory (C), 予備的 (P, Provisional) に分類されています >>84。 もっとも実用上はこの違いは然程重要ではありません。
[12] 文字と特性のデータは >>9 の各ファイルに含まれています。どのように記述されているかはそれぞれの特性により異なり、 UAX #44 >>4 などに説明があります。
[37] 特性とその利用法については、 Unicode Standard 本体、 UCD の UAX #44、 UCD の各ファイル、 参照している各 UAX/UTS に分散して記述されています。 あちこちに情報が少しずつあって、 しかも相互のリンクが不十分なので、 苦労することも多いです。
[26] 単純特性と派生特性の違いは、 その特性が規定であるか参考であるかとは無関係です。 特性の重要度とも関係しません。
[25] contributory properties は、 単純特性のうち、 派生特性の規則の記述を簡潔にしたり一般化したりするために敢えて設けられたものです。 例外リストの記述の便法として使ったり、 重要な派生特性の安定性の保証に関係して使ったりされます。 >>22
[28] 派生特性の導出方法は、 UCD の各ファイルに注釈として説明がありますが、 改訂されることがあります >>22。 注釈の説明は参考です >>40。 導出方法と示された特性値が矛盾する場合、 示された特性値の方が規定と解釈されるべきです >>22。 実装は、誤りを防ぐため、単純特性から派生特性を導出するのではなく、 直接派生特性を使うべきです >>22。
[115]
Unicode符号点はただでさえ
[ U+0000
, U+10FFFF
]
という大きな集合なので、
特性値を他の特性値の組み合わせで記述できるなら、
それで保存データ量を削減したいと思ってしまいます。
しかし実際派生特性の計算はかなり複雑だったりしますから、
素直に公式データをそのまま使った方が安全です。
[29] Unicode 10.0 から Unicode 12.1 まで、 segmentation 関係の特性が外部 (UCD 以外) の仕様の特定の版に依存する形で定義されていました。 UAX #14, UAX #29, UTS #51 で説明されていました。 Unicode 13.0 から UCD だけで完結するように改められました。 >>22
[87] 特性は値により次のように分類されています。 >>84
[116] ほとんどの特性には既定値が決められていて、 ファイルで省略されているときはその既定値が特性値となります。 既定値は UCD のファイルの解釈に使うためのもので、 特性を使う処理の性質とは必ずしも関係ありません。
[74] 既定値はファイルのコメントの
@missing
行に機械可読に書かれることがあります。 >>45
いくつかの特性の既定値は例外的なものや複雑な方法で決定されるもので、
個別に説明があります
>>75, >>76。
# @missing: 0000..10FFFF; <none>
... のように、 # @missing:
の後に欄が続きます。
第0欄が適用対象の符号位置 (の範囲)、
第1欄が特性値を表します。
>>45
[78] ただし、一部のファイルには複数の特性が書かれているため、 第1欄が特性名、 第2欄が特性値を表します。 >>45
[79]
値には、
special tag
が使われることがあります。
<node>
は空文字列、
<code point>
は符号位置の値の文字列表現、
<script>
は符号位置の
Script
特性値を表します。
>>45
[97] 値には、 別名が定義されていることもあります >>98。 各仕様書などで使われることがあります。 (>>122)
[102] 私用域の符号位置にも、 他の符号位置と同じように特性値が決められています。
[490]
Unicode
の多くのアルゴリズムは、
General_Category
やそれから派生した特性を参照しています。
私用文字に関するその特性値は、
特に禁じた場合を除き、
私的な同意に基づき上書きして設定できます。
>>444
[491] その他の特性についても、 正規化に関係するものを除き、 UCD で定められた特性値は既定値であって、 参考とします。 この既定値は、 典型的な用例に基づき決められたもので、 私的な同意なき場合の一貫した挙動を定めることと、 一般的な利用を簡単化することを意図したものであります。 実装は、その私用に関する要件に従い適宜変更・上書きして構いません。 >>444
[492] 私的な同意に基づき大文字と小文字の関係を設定したり、 結合文字として使うことにしたりできます。 >>444
[4100] NFC など Unicode で規定された正規化は、 私用文字を変化させません。 私的な同意があってもこの挙動を変化させてはなりません。 (もちろん独自の正規化手法を採用する場合はこの限りではありません。) >>444
[4101] 特性値をどの程度変更しても良いかについて、 The Unicode Standard は特に言及していません。 しかし Unicode で規定される各アルゴリズムや、 特性値を参照するそれ以外の仕様書の規定、 特性値を参照するアプリケーション固有の挙動などは、 必ずしもあらゆる特性値の組み合わせを扱えるわけではありません。 他のどの Unicode文字でも起こり得ない組み合わせに対する挙動は想定されていない可能性があります。 仕様上は想定されていても、実装上は除去して最適化されていることがあり得ます。
[4102]
とりわけ、
他の特性値から導出されるいくつかの特性値を扱うアルゴリズムは、
各特性値の一貫性を前提にしているかもしれません。
導出は Unicode の仕様書上の概念に過ぎず、
実装上は一方から他方が計算されるとは限りません
[4103] 特性は既に相当数規定されている上に、 Unicode の改正のたびにどんどん追加されています。 私用文字のそれぞれについて、 すべての特性を適切な値に保ち続けるのは困難です。
[4104] そう考えると、 私用文字の定義の時に特性を1つ1つ設定していく方法より、 予め用意した特性値の組み合わせの中から適当なものを1つ選択する方法の方が、 現実的な実装手段ではないでしょうか。 「予め用意した特性値の組み合わせ」 も、 新たに独自に用意するよりは、 既存の Unicode符号位置を1つ選ぶことで記述するとした方が簡単そうです。 既存のどの Unicode符号位置とも特性が一致しない私用文字を使いたい可能性は、 それほど高くないでしょうから、 多くの利用はカバーできそうです。
[4105]
例えばアルファベット系の外字なら「A
」、
漢字系の外字なら「一
」
のように性質の似た既存の文字を選ぶ形にすればいいということです。
[4106] ただしこの手法でも、 大文字・小文字の変換の特性値や Unihan 系の特性値など、 すべての特性値を丸々コピーするわけにはいきません。
[4108] アプリケーションによっては、 相互運用性のため、 私用文字が使えたとしても特性値の変更までは認めない、 または特定の場面では特性値の変更を関知しないような制限があるかもしれません。
[4109]
例えば正規表現の \p
は特性値によって文字の一致を判定します。
ネットワークで配布する条件記述ファイル中に含める正規表現で、
一致するか否かが変わると相互運用性に支障が出るまら、
必ず UCD の特性値通りに動作すると定めるべきでしょう。
[4110] 逆に、テキスト編集アプリケーションで、 選択した文字列の大文字を小文字に変換するボタンなら、 相互運用性には支障がなさそうですから、 利用者の便宜を優先するのが良さそうです。
[157] Unicode は Unicode符号位置について規定していますが、 それ以外については規定していません。しかし実際には、
が存在しています。現代においては Unicode をまったく無視したシステムは非現実的なので、 多かれ少なかれ Unicode の文字特性を活用することになりますが、 その場合の Unicode 以外との接続が問題となります。
U-00110000
以上の符号位置は、
PUP は私用文字、それ以外は非文字の特性を準用するのがいいと思われます。[123] UCD の特性やその値には、大量の別名があります。
PropertyAliases.txt
には、
特性の別名が収録されています >>1, >>98。PropertyValueAliases.txt
には、
特性値の別名が収録されています >>105。[126] 別名には次のような構文上の要件があります。 >>98 オリジナルの特性や特性値については明言されていませんが、 それらも等しく“別名”であるとして同じ規則が適用されるものと思われます。
[125] 特性や特性値の一致には、 別名も考慮するべきです >>98。
[138] 特性の別名は、それが1つの名前空間となります。 特性値の別名は、各特性が1つの名前空間となります。 >>98
\p
においては、二値特性の名前を記述するべき欄に特例で
General_Category
と
Script
の特性値を記述できます。
\p
においては、
特性の名前として
UCD特性の他にもいくつかの値が指定できます。
また、特別な意味を持つ
identity
という値も指定できることがあります。[106]
先頭の is
の有無 (>>148)
だけの違いで別名の解釈が変わることもありません。
>>73
[107] 別名は他の値と互いに等価です。 UCD の各ファイルにはオリジナルの値が使われていることもあれば、 別名が使われていることもあります。 UCD を読み取る実装はすべての値に対応する必要があります。 UCD の特性を使う実装も、普通はすべての値に対応する必要があります。
[131] プラットフォームに応じて別名を変換したり、 他の別名を追加したりしても構いません。 しかしながら、 データ形式等では相互運用性のため UCD の別名を使うことが推奨されます。 >>98
[156]
Perl の正規表現 \p
における General_Category
では、
UCD の別名に加えて L&
が使えます。
[124] 特性や特性値の別名 (記号値) の一致 (等価性) は、 次によります。 >>73 UAX44-LM3
[149]
なお、 Line_Break
に IS
がありますが、
値全体であって接頭辞ではないこと、
null value (ここでは空文字列のことか)
は有効な値ではないことに注意されています。
>>73
[152]
Unicode正規表現の \p
では、
この一致によることが推奨または要求されます。
ただし、
is
を無視する件は要求されないことがあります。
[153]
\p
では特性値をワイルドカード比較できます。
このとき無視は行われず、元の値と比較されます。
[134] 通常の別名は安定性が保証されています。 >>98 改訂によって変更・削除されることがありません。
[133] ただし、 予備的特性や予備的データファイルについても別名は設定されることがありますが、 安定性は保証されません。 >>98
[145] 文字の名前を表す Name
の一致は、
特にその方法が規定されています。
>>73 UAX44-LM2
[13] UCD は Unicode が改版される度に併せて改訂されています。特に小改訂は UCD の更新が主目的であることもあります。
[14] Unicode の版によって値が変化する(可能性のある)特性もあれば、 不変であることが保証されている特性もあります。特性自体も改版により増えたり、減ったりしています。
[15] >>8 の通り、多くの言語やプロトコルには何らかの形で UCD のデータや Unicode の演算の実装が含まれています。それぞれが対応している Unicode の版に違いがあると、 正しくない結果が得られる可能性もあります。
[31] UCD のある特定の版は、 安定であって、出版後変更されることがありません >>30。 誤りは Errata で公表され、必要に応じて次の版で修正されます >>30。 しかしその特定の版のファイル自体は変更されません。
[32] UCD は、 Unicode の Webサイトで版ごとに公開されています。 この URL は安定で、 恒久的に提供されるとされています。 >>30 UCD の各ファイルは Webサイトから誰でも無償で入手可能です。
[42] 版が指定されない、最新版の UCD にアクセスできる URL もあります >>6。 UCD を使ったプログラムのための元データとして取得するときは、 この URL を使うのが便利です。
[33] (版をまたいだ) 特性の安定性は、 Unicode Consortium Stability Policies にまとめられています。 >>30 UAX #44 で変更しないと定められているものもあります >>100。 一度決めた値が変更されることはない特性もあれば、 変更される可能性があるものもあります。
[34]
U+200B
ZERO WIDTH SPACE
の
General_Category
は、
Zs
から
Cf
に改正されました。
>>30
[36] 特性は、 廃止されることがあります >>30。 廃止特性は、 重ねて非推奨や安定化されることがあります >>30。 状況の変化によって不要となったものが指定されるようです。 ただし特性自体は削除されることはない >>30 とされ、恒久的に残されるようです。
[39] 非推奨の特性は、 使うべきではありません >>30。
Deprecated
という名前の特性もありますが、また別です。[38] 安定化された特性は、 値が凍結されて以後メンテナンスされません >>30。
[43]
UCD
に含まれる説明の .html
ファイルは、
廃止されることがあります
>>41。
廃止されると新しい版の
UCD
にはファイル自体が含まれなくなるようです。
[17] UCD のデータは EXHIBIT 1 UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE の対象となっています。示された条件に従う限り、ソフトウェアへの組み込みなど自由に利用できるようです。
[9] UCD のデータはテキストファイルとして提供されています。その書式はファイルにより異なり、 UAX #44 >>4 で説明されています。
[83] これらのファイルの多くは文字の特性を記述したものですが、 それ以外のものもあります。 特性以外の各ファイルは規定 (N, Normative), 参考 (I, Informative), 予備的 (P, Provisional) に分類されています >>82。 特性にもそれぞれの状態が定められています (>>85)。 もっともこの分類は仕様書としての形式的なもので、 実用上気にする場面はありません。
[46] 比較的古いファイルは独特の形式で、 比較的新しいファイルはできるだけ共通の形式を採用しているようです。 ファイルと特性の関係に規則性はなく、 個別に調べていくしかありません。 1つのファイルで複数の特性が定義されていることがあります。
[47] 多くのファイルは次のような構造をしています。 >>45
LF
区切りの行指向のファイルです。#
から行末まではコメントです。
構文解析時にまず除去します。;
で区切られた欄で構成されます。
0起算で数えます。[65] コメントには、
行頭に #
があって欄がないものもあります。
ファイルの先頭にはファイル情報が書かれています。
派生特性はその導出方法が書かれています (>>28)。
既定値についての説明が書かれていることもあります
(>>74)。
@missing
は構文解析して使えることになっています。
[66] 欄の後にコメントが続くこともあります。 一定の書式で参考になる情報が書かれている場合もあります >>45。 しかしあくまで参考であって、 変更されることもあり得るので、 構文解析して使うべきではありません >>45。
[68] 第0欄には符号位置またはその範囲が指定されます。 また特性の値に符号位置が指定されることがあります。 次のように記述されます >>45。
U+
はつけません。)..
で連結して表します。UnicodeData.txt
[58] UnicodeData.txt
は、
UCD
のファイルの1つです。
古くからある基礎的な特性が記述されています。
[60] UnicodeData.txt
のデータは他のファイルにも含まれていて、
そちらの方が使いやすいかもしれません。
[62] このファイルの形式は、 UCD の新しいファイルの形式 (>>46) と少し違うところもあります。
[80] 欄が空文字列のとき、 既定値であることを表します。 >>45
[61] CJK統合漢字やハングル音節や私用域などは各符号位置ではなく範囲として記述されているので注意が必要です。 また、未割当の符号位置や非文字は含まれていません。
[64] この範囲の記述形式は、
新しいファイルのような ..
を使う形式ではなく、
範囲の先頭の符号位置と、最後の符号位置の行を別々に記述する形式となっています。例えば、
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; 9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
... のように <..., First>
,
<..., Last>
と書かれた2つの行で範囲であることが示されます。>>45
[110] UCD やその他のUnicode符号点 (やUnicode符号点の列) の特性の情報は、 文字のレンダリングをはじめ文字の各種の処理で参照されます。 具体的には各特性の項を参照。
[111]
Unicode正規表現は UCD やその他の特性の多くにアクセスできる機能
\p
を提供しています。
多くのプログラミング言語等の正規表現に組み込まれています。
[113] 多くのデータ形式やプロトコルが、識別子やデータの構文の定義のために UCD やその他の特性を直接または間接的に参照しています。
[112] そうした機能の実装のために、多くのプラットフォームや各種のプログラムが UCD の一部または全部を組み込んで使っています。
[16] 符号化文字集合の実装のためには、仕様書本文だけでなく、含まれている各文字の詳細な情報が必要になります。 旧来の符号化文字集合は比較的小規模で性質の似た文字のみを含んでいたこともあり、 そのような情報をほとんど提供してきませんでした。 UCD のような形で機械可読な実装用の情報を提供する符号化文字集合は他に無く、 これが Unicode の成功の要因の1つと言えるかもしれません。 (ISO/IEC 10646 も単独では十分な実装が困難でしょう。)
[20] → ISO/IEC 10646 も単独を諦めて、今では多くの項目が Unicode を参照する形になっています。
[3] UTR #23: The Unicode Character Property Model ( 版) http://unicode.org/reports/tr23/
[18] Remove Unicode database version requirement · whatwg/javascript@4f1a517 ( 版) https://github.com/whatwg/javascript/commit/4f1a517f02bc15e934aafae0ec2b47c80786ab7f