ZWJ (Zero Width Joiner)

幅ゼロの結合子。Unicode で複数の文字や絵文字を 1 つの表示単位に結合するために使われる制御文字 (U+200D)。

ZWJ (Zero Width Joiner) は、Unicode の制御文字 (U+200D) で、画面上には表示されないが、前後の文字を結合して 1 つの書記素クラスタとして扱わせる役割を持ちます。最も身近な用途は絵文字の結合です。たとえば家族の絵文字 👨‍👩‍👧‍👦 は、男性 + ZWJ + 女性 + ZWJ + 女の子 + ZWJ + 男の子 という 7 つのコードポイントで構成されています。

ZWJ による絵文字結合は、Unicode 11.0 以降で大幅に拡張されました。肌の色の組み合わせ、職業と性別の組み合わせ、家族構成の表現など、ZWJ を使うことで限られたコードポイントから多様な絵文字を生成できます。ただし、ZWJ シーケンスに対応していない環境では、結合されずに個別の絵文字が並んで表示されます。

文字数カウントにおいて ZWJ は厄介な存在です。見た目は 1 つの絵文字でも、内部的には複数のコードポイントで構成されているため、プログラミング言語によって「長さ」が異なります。JavaScript の .length は UTF-16 コードユニット数を返すため、👨‍👩‍👧‍👦 は 11 になります。Python は Unicode コードポイント数で 7、Swift は書記素クラスタ数で 1 を返します。

SNS の文字数制限でも ZWJ は影響します。X (旧 Twitter) では絵文字 1 つが 2 文字分としてカウントされますが、ZWJ シーケンスの絵文字はさらに多くの文字数を消費します。140 文字の制限内で絵文字を多用する場合、ZWJ シーケンスの絵文字は避けた方が文字数を節約できます。

この記事を共有