[REFS[
- [11] [CITE@en[U+200D ZERO WIDTH JOINER (‍) - Charinfo]]
( ([TIME[2016-08-29 14:17:58 +09:00]]))
<https://chars.suikawiki.org/char/ZWJ>
]REFS]

* 仕様書

[REFS[
- [18] [CITE[The Unicode Standard, Version 13.0 - ch23.pdf]], [TIME[2020-03-09T17:53:52.000Z]], [TIME[2020-12-09T10:59:29.820Z]] <https://www.unicode.org/versions/latest/ch23.pdf#G15334>
- [12] [CITE[[[The Unicode Standard]], Version 12.0 - ch23.pdf]] ([TIME[2019-03-02 07:15:46 +09:00]]) <https://www.unicode.org/versions/latest/ch23.pdf#G23126>
]REFS]

* 意味

[SEE[ [[続け字]] ]]



[8] [CODE(char)[[[U+200D]]]] [CODE(charname)@en[[[ZERO WIDTH JOINER]]]] は、
[[インド系諸文字]]において [[consonant-conjuct context]] ([[virama]] の直後)
にあって当該 [[conjunct]] の表示を制御します。 [SRC[>>1]]

[15] 定義上[[結合文字列]]に含まれます。

-*-*-

[20] 
[[ANSEL]] の [[C1制御文字]] [CODE(charname)@en[JOINER]]
は
[[Unicode]] の [CODE(charname)@en[ZWJ]]
に対応付けられています。

-*-*-

[29] [CITE@en[BabelStone Fonts : BabelStone Roman]], [TIME[2024-12-13T04:42:38.000Z]] <https://babelstone.co.uk/Fonts/Roman.html>

[30] >>29 は [CN[ZWJ]] の個数で同じ文字列の別の[[合字]]を区別しています。

* 導出特性値

[9] この[[符号位置]]の[[導出特性値]]は [[CONTEXTJ]] です。

* 文脈的規則

** 仕様書

- [1] [CITE@en[RFC 5892 - The Unicode Code Points and Internationalized Domain Names for Applications (IDNA)]] 
<http://tools.ietf.org/html/rfc5892#appendix-A.2>

** 適用範囲

[2] この[[文脈的規則]]は、[[登録]]の際に利用されます。

[3] この[[文脈的規則]]は、 [[lookup]] の際に利用されます [SRC[>>1]]。

** 定義

[7] この[[文脈的規則]]の結果は、次のものと同じです [SRC[>>1]]。

= [4] 一つ前の[[符号位置]]がなければ、[[未定義]]を返して停止します
= [5] そうでなく、一つ前の[[符号位置]]の [[Canonical_Combining_Class]] が [[Virama]] であれば、[[真]]を返して停止します
= [6] そうでなければ、[[偽]]を返して停止します

* 漢字の記述

[SEE[ [[CJK統合漢字合字]] ]]

* エチオピア文字の記述

[SEE[ [[Ethiopic Ligation Database]] ]]

* レンダリング

[SEE[ [[続け字]] ]]


[23] [CITE@ja-jp[OpenType development (LEGACY INFORMATION) - Typography | Microsoft Docs]], [[nihar]], [TIME[2022-08-27T06:51:43.000Z]] <https://docs.microsoft.com/ja-jp/typography/develop/otdevinfo#suggested-glyphs-for-complex-scripts>

[25] [CITE@en[26487 - ZWJ (U+200D) format control should NOT be rendered with its own glyph - chromium]], [TIME[2023-11-11T03:09:05.000Z]] <https://bugs.chromium.org/p/chromium/issues/detail?id=26487>

** 縦書き処理の不具合


[38] [[CJK統合漢字合字]]に対応した[[フォント]]は
[CN[ZWJ]] で[[漢字]]を連結する形になっていて、
[CODE[liga]]
などで置換しています。
[SEE[ [[CJK統合漢字合字]] ]]


[198] 
>>38 この [CODE(charname)@en[ZWJ]] を使った[[合字]]、
[[横書き]]ならうまくいきますが、
[[縦書き]]だと [[Windows]] の [[Chrome]] だと
[CODE[liga]] だろうと [CODE[ccmp]] だろうと、
認識されずに前後2文字ばらばらに縦に並べられてしまいます。
[TIME[2023-11-11T02:45:50.00Z]]

[200] 
[CODE(charname)@en[ZWJ]] の[[合字]]でなく[[基底文字]]と[[結合文字]]の
[CODE[ccmp]] だと[[縦書き]]でも正常に表示されます。
[[結合文字]]でなく [CODE(charname)@en[ZWJ]] が入る時は[[合字]]化の処理より先に[[縦書き]]のための[[書記素クラスター]]の分割が行われてしまうということなのでしょうか。

[201] 
[[Windows]] の [[Firefox]] だと [CODE[ccmp]] は正常に合字化されます。
[CODE[liga]] はデフォルトで無視されますが、
[CODE[[[font-feature-settings]]: "liga"]] 
だと正常に合字化されます。
[WEAK[([[Chrome]] はそれを指定しても変わらない。)]]
[[横書き]]なら自動適用される [CODE[liga]] が[[縦書き]]だとデフォルト無効なのでしょうか。

;; [202] 
[[Chrome]] も [[Firefox]] も、 [CODE(charname)@en[ZWJ]] 入の[[絵文字]]列だと
(表示上は1文字だろうが2文字だろうが)
[[文字列の選択]]に対して1文字扱いになりますが、
[[漢字]]列の方は2文字扱いです。
適切なフォントがあれば [[Firefox]] は横書きでも縦書きでも1文字、なければ2文字で表示し、
[[Chrome]] は横書きなら1文字か2文字、縦書きならフォントがあろうが2文字で表示します。
ということは [[Firefox]] も [[Chrome]] も既知の [CODE(charname)@en[ZWJ]] 
かどうかで挙動を変えているのですが、
[[Chrome]] はそれとは別に[[縦書き]]の実装が弱いと考えられます。


[24] 
[[CJK統合漢字]]だけでなく[[仮名]]でも同じ問題があります。
やはり [[Chrome]] では駄目、 [[Firefox]] では正常です。

[31] 
似た意味の[[文字]]だと [CN[ZWJ]] の他に [CN[WJ]] でも同じような不具合があります。

[32] 
[CN[CGJ]] ではこのような問題は起きません。 [CN[ZWJ]] とは意味が微妙に違い、
[CN[CGJ]] では [CN[ZWJ]] の代替にはならないのですが、
やむを得ず他の文字で代替するなら [CN[CGJ]] が一番ましかもしれません。



* 関連

[10] 逆を表す [CODE(charname)@en[[[ZERO WIDTH NON-JOINER]]]] もあります。

[17] 
[CODE(charname)@en[ZWSP]]
とは違って
[[word break]]
や
[[line break]]
には影響しません。
[SRC[>>18]]


[16] 
[CODE(charname)@en[CGJ]] とは挙動が違います。

[19] 
文脈を提供する文字という機能は
[CODE(charname)@en[LRM]],
[CODE(charname)@en[RLM]],
[CODE(charname)@en[ALM]]
と似ています。
[SEE[ [[bidirectional ordering controls]] ]]


* 歴史

[21] [[ISIRI 3342]]

[22] [CITE[2011-08-six-years-of-persian-domain-names.pdf]], [TIME[2018-03-04T20:08:20.000Z]], [TIME[2022-05-14T03:26:47.602Z]] <https://persian-computing.org/archives/IRNIC/2011-08-six-years-of-persian-domain-names.pdf>

[14] [CITE[Emoji ZWJ Sequences Catalog]]
([TIME[2016-06-15 08:29:35 +09:00]])
<http://www.unicode.org/emoji/charts/emoji-zwj-sequences.html>

[13] [CITE@en[Editorial: remove ZERO WIDTH JOINER characters]]
([[ricea]]著, [TIME[2016-12-05 13:13:48 +09:00]])
<https://github.com/whatwg/streams/commit/c58d42aa731cd494c522c90e6eeefd66cbc25b3b>

[26] [CITE@ja-x-mtfrom-en[CSS に 4 つの新しい国際化機能を導入 | Blog | Chrome for Developers]], [TIME[2023-12-04T08:00:00.000Z]], [TIME[2023-12-13T06:54:58.772Z]] <https://developer.chrome.com/blog/css-i18n-features?hl=ja>

>境界検出は ML エンジンによって実行されるため、意図したとおりの結果が得られない可能性があります。そのような場合は、ブレークポイントを手動で調整できます。[CODE[<wbr>]] タグまたは Zero Width Space([CODE[&ZeroWidthSpace;]])は中断可能な点を適用し、Zero Width Joiner([CODE[&zwj;]])は中断を防ぎます。


[27] [[日本語]]に [CODE(charname)@en[ZWSP]] や [CODE(charname)@en[ZWJ]]
を挿入させる慣習は現在存在しないわけだが、これによって今後増えたりするんだろうか?


[28] 
[CODE(charname)@en[ZWJ]] を[[合字]]化を目的とせず[[改行]]制御のために使うのは、
禍根を残したりしないんだろうか?





