[1] [DFN[[RUBYB[合成除外表] [Composition Exclusion Table]]]]は、
[[正準分解]]可能な[[文字]]のうち、[[合成]] ([[初等合成]]) が行われないものの表です。
[[NFC]] や [[NFKC]] は[[分解]]の後に[[初等合成]]を行いますが、ここで[[合成]]結果として採用しない[[文字]]の表がこの[[合成除外表]]です。

* 仕様書

[REFS[
- [5] [CITE@en-us[UAX #15: Unicode Normalization Forms]] ([TIME[2010-09-18 09:52:06 +09:00]] 版) <http://www.unicode.org/reports/tr15/#Primary_Exclusion_List_Table>
- [20] <http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt>
- [30] <http://www.unicode.org/Public/UCD/latest/ucd/DerivedNormalizationProps.txt>
]REFS]

* 分類

[6] [[合成除外表]]に含まれる[[文字]]は4種類に分類されます。

** 用字系固有の合成除外文字

[7] [DFN[[RUBYB[用字系固有]@en[script-specific]]]]に分類される[[文字]]は、
[[正準分解]]できるものの、通常はその[[用字系]]の利用時に[[合成]]形は使わないものです。
[SRC[>>5]]

[8] 例: [CODE(char)[[[U+0958]]]] [CODE(charname)@en[[[DEVANAGARI LETTER QA]]]] ([CODE(char)[[[क़]]]])
[SRC[>>5]]

** 合成版の後に追加された合成除外文字

[9] [DFN[[RUBYB[合成版後]@en[post composition version]]]]に分類される[[文字]]は、
[[合成版]]であるところの [[Unicode]] 3.0 よりも後に追加された[[正準分解]]できる[[文字]]です。
[SRC[>>5]]

[10] 例: [CODE(char)[[[U+2ADC]]]] [CODE(charname)@en[[[FORKING]]]] ([CODE(char)[[[⫝̸]]]])
[SRC[>>5]]

** 一人っ子合成除外文字

[11] [DFN[[RUBY[一人っ子][シングルトン]@en[singleton]]]]に分類される[[文字]]は、
[[文字]]1つだけへの[[正準分解]]を持つ[[文字]]です。 [SRC[>>5]]

[12] 例: [CODE(char)[[[U+2126]]]] [CODE(charname)@en[[[OHM SIGN]]]] ([CODE(char)[[[Ω]]]])
[SRC[>>5]]

[2] [DFN[[RUBYB[一人っ子] [singleton]]]]というのはちょっとわかりにくいのですが、
[[UAX]] #15 には次のような例が挙げられています。

= [CODE(char)[[[U+212B]]]] ([CODE(char)[[[ANGSTROM SIGN]]]])
の正準分解は [CODE(char)[<[[U+0041]], [[U+00C5]]>]]
([CODE(char)[<[[LATIN CAPITAL LETTER A, COMBINING RING ABOVE]]>]]) である。
= [CODE(char)[[[U+00C5]]]] ([CODE(char)[[[LATIN CAPITAL LETTER A WITH RING ABOVE]]]])
の[[正準分解]]も [CODE(char)[<U+0041, U+00C5>]] である。
= つまり、 [CODE(char)[U+212B]] が [CODE(char)[U+00C5]]
になってしまう ([DFN[一人っ子分解]])。

;; [16] 要は[[重複符号化]]の下らない後始末です。

** 非開始子分解の合成除外文字

[13] [DFN[[RUBYB[非開始子分解]@en[non-starter decompositions]]]]に分類される[[文字]]は、
[[正準分解]]で複数の[[文字]]に展開されるものであって、その[[文字]]自体が[[開始子]]で無いか、
または[[正準分解]]した最初の[[文字]]が[[開始子]]で無いものです。
[SRC[>>5]]

[14] 例: [CODE(char)[[[U+0344]]]] [CODE(charname)@en[[[COMBINING GREEK DIALYTIKA TONOS]]]]
([CODE(char)[[[   ̈́]]]]) [SRC[>>5]]

* 安定性

[17] 新たに[[正準分解]]が追加される場合、その[[分解]]結果の[[文字]]のうち一つでもそれ以前の版の
[[Unicode]] に含まれていたなら、[[合成除外表]]に追加しなければなりません。
[SRC[>>5]]

;; [19] これは[[強い正規化安定性]]の要求よりも少し強い要件に見えますね。

[18] >>17 に該当しない場合は、[[合成除外表]]に入れても入れなくても構いません。
どちらにするかは、[[合成形]]を普通に使うかどうかによって決めます。
[SRC[>>5]]

[23] 既存の[[文字]]の[[合成除外表]]への追加や削除は、 [[NFC]] や [[NFKC]] の結果が変わってしまうことになるので、
[[正規化形]]の安定性の原則から認められません。

** 訂正 #2

[24] [[Unicode]] 3.0.0 と [[Unicode]] 3.0.1 では
[CODE(char)[[[U+FB1D]]]] [CODE(charname)@en[[[HEBREW LETTER YOD WITH HIRIQ]]]]
が本来[[合成除外表]]に入れられるべきところ、誤って入っていなかったとして、
[DFN[[RUBYB[訂正]@en[Corrigendum]] #2]] で修正されています。
[[Unicode]] 3.1.0 以降では[[合成除外表]]に含まれています。
[SRC[>>25、>>3]]

[26] このため、この修正の前後では [[NFC]] と [[NFKC]] の結果が変化することがあります。

[27]
非互換変更はしないつもりだけど使用頻度は高くないし云々などという恥ずかしい言い訳
[SRC[>>25、>>3]] をまたしておりますぞ。懲りない連中ですこと。

;; [29] 非互換変更はもうしない [SRC[>>3]] と書いているにも関わらず、[[訂正 #3]] 以降が続くわけですがwwwww

* 一覧

[21] [[合成除外表]]は >>20 で配布されています。ただし >>11 と >>13 は他の[[特性]]から計算できるということで、
[[コメント化]]されています。 [SRC[>>5]]

[22] すべての一覧は、 [[UCD]] に[[特性][特性 (Unicode)]] [DFN[[[Full_Composition_Exclusion]]]] として含まれています。 [SRC[>>5, >>30]]

[31] 狭義の[[合成除外表]]に含まれる[[文字]]の一覧は、 >>33 にあります。
すべての含まれる[[文字]]の一覧は、 >>32 にあります。

[REFS[
- [33] [CITE@en[Character set "CompositionExclusions"]] ([TIME[2016-08-13 18:36:28 +09:00]]) <https://chars.suikawiki.org/set/%24unicode%3ACompositionExclusions>
- [32] [CITE@en[Character set "$unicode:Full_Composition_Exclusion"]] ([TIME[2014-05-02 15:05:14 +09:00]] 版) <http://chars.suikawiki.org/set/%24unicode%3AFull_Composition_Exclusion>
]REFS]

* 歴史

** 訂正 #2

[28] [[Unicode]] 3.0 と [[Unicode]] 3.1 の間の[[訂正 #2]] で1[[文字]]非互換に追加されました
(>>24)。

- [25] [CITE@en-us[Corrigendum #2: Yod with Hiriq Normalization]] ([TIME[2011-04-01 06:49:11 +09:00]] 版) <http://www.unicode.org/versions/corrigendum2.html>
- [3] [CITE@en-us[Normalization Corrigendum]] ([TIME[2003-06-03 08:03:42 +09:00]] 版) <http://www.unicode.org/uni2errata/Normalization_Corrigendum.html>

* 関連

[4]
[[正準XML]] などいくつかの正規化に関する規定を含んだ仕様が >>24 の[[訂正票]]を参照しています。

* メモ

[15] これらを除外しておかないと、 [[NFC]] や [[NFKC]]
の結果が一意に定まらないことになってしまいます。