* 仕様書

[REFS[
- [164] [CITE[The Unicode Standard, Version 13.0 - ch07.pdf]], [TIME[2020-03-09T17:53:38.000Z]], [TIME[2020-12-07T09:15:13.901Z]] <https://www.unicode.org/versions/latest/ch07.pdf#M9.37081.HeadingBreak.79.Combining.Marks>
- [4] 
[CITE[The Unicode Standard, Version 13.0 - ch23.pdf]], [TIME[2020-03-09T17:53:52.000Z]], [TIME[2020-12-13T05:57:54.294Z]] <https://www.unicode.org/versions/latest/ch23.pdf#G24326>

]REFS]

* 構文

[22] 
[[基底文字]]の後に任意の個数使えるようです。
連続して挿入したり、
[[結合文字]]の連続の最初や最後に挿入したりすることも、
禁止はされていません。
(意味があるかどうかはまた別。)

* 文脈

[5] 
[CODE[U+034F]]
[CODE(charname)@en[COMBINING GRAPHEME JOINER]]
([CODE(charname)@en[CGJ]])
は、
[[言語]][RUBYB[依存][sensitive]]の[[照合]]と[[検索]]のため、
隣接[[文字]]の[[照合]]に関与するべく使うものです。
[SRC[>>4]]

[6] 
[CODE(charname)@en[CGJ]]
は、
通常[[正準的に等価][正準等価]]な[[文字列]]を区別するためにも使います。
[SRC[>>4]]


[13] 
[[Unicode  Collation  Algorithm]]
は
[[collation weighting]]
の適用前に[[正規化]]するため、
その時点で[[結合文字]]の順序を入れ替えてしまいます。
[CODE(charname)@en[CGJ]]
は
[[collation key weighting]]
では通常無視されるのですが、
順序の入れ替えを抑制するので、
[[結合文字]]に関する
[[secondary key weight]]
の順序に影響が出ます。
これによって、
[CODE(charname)@en[CGJ]] や[[結合文字]]の重みを
[[tailor]]
することなしに[[検索]]や[[整列]]で[[文字列]]を違って扱わせることができます。
[SRC[>>4]]

[14] 
[[UCA]]
における
[[contraction]]
の形成を防ぐためにも使うことが出来ます。
例えば[[スロバキア語]]に [[tailor]]
した[[照合]]では
[CODE[ch]]
を単一の[[単位]]として扱いますが、
<c, [CODE(charname)@en[CGJ]], h>
は
[CODE[c]] の後に [CODE[h]]
として[[整列]]されることになります。
[[ドイツ語]]では
[CODE[ü]]
を一般的な u-umlaut と解して <u, e> のように[[整列]]させるケースと、
稀な u-diaeresis と解して [CODE[u]] に [[secondary key weight]]
がついたものとして[[整列]]させるケースがあり、
[CODE(charname)@en[CGJ]]
により区別できます。
[CODE(charname)@en[CGJ]] や[[結合文字]]の重みを
[[tailor]]
することなしに実現できます。
[SRC[>>4]]

;; [15] 
[CODE(charname)@en[CGJ]]
は不可視でかつ
[CODE[Default_Ignorable_Code_Point]]
なので、
他の処理では問題を起こさないはずとされています。
[SRC[>>4]]



[11] 
[[ヘブライ文字]]のアクセントやマークは、
分析やテキスト表現のために順序が意味を持つことがあります。
[[typographical]] 的にも相互作用します。
にも関わらず[[結合クラス]]が等しいので、
[[正準再順序付け]]で入れ替えられてしまいます。
そこで
[CODE(charname)@en[CGJ]]
で抑制できます。
具体的には
<lamed, patah, hiriq, finalmem>
と
<lamed, hiriq, patah, finalmem>
の区別のために
<lamed, patah, [CODE(charname)@en[CGJ]], hiriq, finalmem>
のように書きます。
[SRC[>>4]]

;; [12] 
この説明の通りであるなら、それは[[正準結合クラス]]の欠陥なのでは...
[[正規化]]はデータを破壊する危険な操作ということです。

[1] 
通常[[結合文字]]の[[二重ダイアクリティカルマーク]]はかなり外側に表示されます。
その他の[[ダイアクリティカルマーク]]と併用しようとしても、
内側に表示されてしまいます。
[[二重ダイアクリティカルマーク]]に対して[[ダイアクリティカルマーク]]を表示させたいとき、
[CODE(charname)@en[CGJ]] 
が使えます。
[SRC[>>164]]
[SEE[ [[結合文字]] ]]

[EG[
[2] 
[CODE[U+0075]]
[CODE[U+0361]]
[CODE[U+0301]]
[CODE[U+0069]]
は、
[CODE[ui]]
の
[CODE[u]] の上に [CODE[']] がつき、
それと [CODE[i]] の2文字が [CODE[⌒]]
で覆われます。

[3] 
[CODE[U+0075]]
[CODE[U+0361]]
'''[CODE[U+034F]]'''
[CODE[U+0301]]
[CODE[U+0069]]
とすると、
[CODE[ui]]
の2文字が [CODE[⌒]]
で覆われ、その上の中央に [CODE[']]
がつきます。
[SRC[>>164]]
]EG]


;; [16] 
どうにも1つの[[文字]]に機能を盛りすぎのように見えますし、
[[UCA]]
での用例は特定のアルゴリズムの内部挙動の制御のためだけに1つの[[文字]]を割り当てるという贅沢な感もあります。

[24] 
[CITE@en[BabelStone Fonts : BabelStone Roman]], [TIME[2024-12-13T04:42:38.000Z]] <https://babelstone.co.uk/Fonts/Roman.html>

[25] 
[[shaping]] の不具合の対処のためやむを得ず [CN[ZWJ]]
の代替で使われることがあります。

[26] 
[[Stream-Safe Text Process]]
で挿入されることがあります。

* 処理


[7] 
[CODE(charname)@en[CGJ]]
は、
[CODE[General_Category]] = [CODE[Mn]],
[[正準結合クラス]] = [N[0]]
の[[結合文字]]であって、
[[format control character]]
ではありません。
[SRC[>>4]]

[8] 
[[正準結合クラス]] [N[0]] のため、
[[正準再順序付け]]によって
[CODE(charname)@en[CGJ]]
をまたいだ[[結合文字]]の順序変更は行われません。
[SRC[>>4]]
つまり通常なら
[[NFC]]
などの[[正規化]]で整列されてしまう[[結合文字]]の順序を維持したい時に使うことが出来ます。

[10] 
従って
[CODE(charname)@en[CGJ]]
は、
例外的な処理または[[レンダリング]]のために通常なら区別されない[[結合文字]]の順序を区別したいとき、
使うことができます。
[SRC[>>4]]

[17] 
[[UCA]]
において
[CODE(charname)@en[CGJ]]
を含む列に違う重みを持たせるよう
[[tailor]]
する、
例えば
<c, h>
と
<c, [CODE(charname)@en[CGJ]], h>
で違う重みとすることができますが、
[RUBYB[非推奨][not recommended]]です。
[SRC[>>4]]


* レンダリング

[9] 
[CODE(charname)@en[CGJ]]
は、
可視的な[[グリフ]]を持ちませんし、
前後の文字に直接的な書式付け効果を与えません。
[SRC[>>4]]

[HISTORY[
[18] 
古い実装は、
[CODE(charname)@en[CGJ]]
で連結された複数の[[書記素クラスター]]を、
[[囲み結合文字]]の適用に関して1つの単位として扱います。
[SRC[>>4]]
現在はこれは推奨されていません。
[SEE[ [[囲み結合文字]] ]]

[19] 「ch」を囲んで丸付き記号にするような用途が想定されていたのでしょうか。
代替手段は提供されていないようです。

]HISTORY]

* 関連

[20] 
[CODE(charname)@en[ZWJ]] とは違って[[続け字]]や[[合字]]には影響しません。
[SRC[>>4]]

[21] 
[CODE(charname)@en[WORD JOINER]]
とは違って[[改行]]には影響しません。
[SRC[>>4]]

* メモ

[23] [CITE@ja[UTC #181 properties feedback & recommendations - Google Docs - 24224-utc181-properties-recs.pdf]], [TIME[2024-11-01T20:34:49.000Z]], [TIME[2024-11-06T03:09:31.378Z]] <https://www.unicode.org/L2/L2024/24224-utc181-properties-recs.pdf#page=19>

