ZWJ (ゼロ幅接合子) とは - 絵文字を 1 つに結合する見えない文字
この記事は約 4 分で読めます。
ZWJ は、別々の絵文字をつないで家族絵文字や職業絵文字のような「合成絵文字」を作る、見えない接着剤です。正式名称は Zero Width Joiner (ゼロ幅接合子)。コードポイント U+200D に割り当てられた、 画面上の幅を一切持たない制御文字です。絵文字と絵文字の間に挟むと、 「この 2 つを 1 つの絵として表示してほしい」という指示になります。
定義
ZWJ (U+200D) はもともと、アラビア文字やインド系文字のように前後の文字によって字形が変わる文字体系のために 用意された制御文字です。それが絵文字の世界に転用され、既存の絵文字を組み合わせて 新しい絵文字を表現する「ZWJ シーケンス」の部品になりました。 家族絵文字のバリエーションが 2015 年に主要プラットフォームへ広がった際に本格的に使われるようになり、 Unicode の絵文字仕様 (UTS #51) に標準の仕組みとして収載されています。
重要なのは、対応していない環境では合成が解けて個別の絵文字が並んで表示されるという設計です。 壊れて豆腐 (□) になるのではなく「👨 👩 👧 と 3 つ並ぶ」だけなので、意味はかろうじて伝わります。 この安全な劣化 (フォールバック) が、ZWJ が広く使われている理由のひとつです。
代表的な ZWJ シーケンス
| 種類 | 例 | 構成 |
|---|---|---|
| 職業 | 👩💻 | 👩 + ZWJ + 💻 |
| 家族 | 👨👩👧 | 👨 + ZWJ + 👩 + ZWJ + 👧 |
| 性別の指定 | 🏃♀️ | 🏃 + ZWJ + ♀️ |
| 旗の合成 | 🏳️🌈 | 🏳️ + ZWJ + 🌈 |
| 色・種類違い | 🐈⬛ | 🐈 + ZWJ + ⬛ |
黒猫 🐈⬛ のように「既存の絵文字 + 色」で新しい動物を表す方式は、新しいコードポイントを追加せずに 絵文字を増やせるため、Unicode の新版でも定番の手法になっています。
文字数カウントへの影響
家族絵文字 👨👩👧👦 は、見た目は 1 文字でも中身は 7 コードポイント (絵文字 4 つ + ZWJ 3 つ) です。 さらに JavaScript の .length はコードポイントではなく UTF-16 単位で数えるため、 この絵文字 1 つで 11 と数えられます。文字数制限のあるフォームや SNS で 「1 文字しか入れていないのに文字数オーバーになる」現象の正体はこれです。 絵文字 1 つが 2 文字と数えられる基本の仕組みはサロゲートペアで解説しています。
実務での注意点
- コピペで壊れることがある: テキスト処理の途中で ZWJ が除去されると、合成が解けて絵文字がバラバラに並びます。範囲選択より絵文字ピッカーからの入力が安全です
- 古い端末では分解表示される: 新しい ZWJ シーケンスほど対応が遅れます。確実に伝えたい場面では、単体のコードポイントを持つ絵文字を選ぶのが無難です
- プログラムで切り出すと壊れる: 文字列を先頭から n 文字で切る処理が ZWJ シーケンスの途中で切ると、絵文字が分解されます。書記素 (見た目の 1 文字) 単位で扱うライブラリを使いましょう
関連用語
- サロゲートペア - 絵文字 1 つが「2 文字」と数えられる符号化の仕組み
- 異体字セレクタ (Variation Selector) - 絵文字表示とテキスト表示を切り替える、もうひとつの見えない文字
- 絵文字 (Emoji) - Unicode に収録されたピクトグラフィック文字
- Emoji ZWJ Sequences Explained (英語版記事) - ZWJ シーケンスのより詳しい技術解説
この記事は役に立ちましたか?