異体字セレクタ (Variation Selector) とは
この記事は約 4 分で読めます。
❤️ という赤いハートが「ハート 1 つで 2 コードポイント」になる理由が異体字セレクタです。異体字セレクタは、直前の文字の表示形を切り替えるための不可視の制御文字です。 絵文字とテキスト表示の切替、漢字の異体字 (旧字体・新字体など) の指定、絵文字シーケンスの調整など、Unicode の細やかな制御を支えています。
定義
異体字セレクタ (Variation Selector) は、Unicode の不可視な制御文字で、直前の文字の表示形を切り替える役割を持ちます。 16 個の基本セレクタ (VS-1 から VS-16, U+FE00〜U+FE0F) と、240 個の補助セレクタ (VS-17 から VS-256, U+E0100〜U+E01EF) があります。 絵文字の文脈で頻繁に登場するのは VS-15 と VS-16 の 2 つです。
VS-15 と VS-16
| セレクタ | コードポイント | 意味 | 表示例 |
|---|---|---|---|
| VS-15 | U+FE0E | テキスト表示 (モノクロのテキスト調) | ♥︎ (テキスト調のハート) |
| VS-16 | U+FE0F | 絵文字表示 (カラーの絵文字調) | ❤️ (赤い絵文字のハート) |
多くの記号文字 (♥, ☂, ☀, ☘, ✉ など) は、Unicode に追加された当初はテキスト記号として登録されていました。 後から絵文字としての利用が広まったため、「テキスト調」と「絵文字調」を切り替えるためにこの 2 つのセレクタが導入されました。
❤️ が 2 コードポイントになる理由
絵文字としての ❤️ は、内部的には次の 2 つのコードポイントの組み合わせです。
- ♥ (U+2665) - ベースのハート記号 (テキスト記号として古くから存在)
- U+FE0F (VS-16) - 絵文字表示を要求するセレクタ
VS-16 を省略すると ♥ という細いラインのハート記号として描画されるシステムがあります。 絵文字としての赤いハートを表示するには、VS-16 が必要です。 この 2 コードポイント構造が、文字数カウントで「絵文字 1 つで 2 文字消費」になる主な理由の 1 つです。
絵文字シーケンスでの登場
ZWJ シーケンスでは、ベース絵文字の後に VS-16 を挟むパターンがよく使われます。 たとえば 🏳️🌈 (虹色の旗) は次のシーケンスです。
- 🏳 (U+1F3F3) - 白旗
- U+FE0F (VS-16) - 絵文字表示
- U+200D (ZWJ) - 結合
- 🌈 (U+1F308) - 虹
VS-16 を省くと旗が表示されないシステムがあるため、互換性のために必須となるケースが多いです。
漢字の異体字との関係
異体字セレクタは元々、漢字の旧字体・新字体・別字体を指定するために設計されました。 IVS (Ideographic Variation Sequence) と呼ばれる仕組みでは、ベース漢字 + VS-17 から VS-256 の組み合わせで、特定の字体を明示的に指定できます。 たとえば「葛」の異体字 (草冠の下が「曷」か「匂」かなど) は IVS で区別されます。 絵文字の文脈では使われませんが、日本語処理の現場では重要な仕組みです。
実務での注意点
- 文字数カウント: VS-16 を含む絵文字は 2 コードポイントで構成されることを意識する
- テキスト処理: 文字列の逆順処理や部分切り出しで、VS とベース文字を分離しないよう注意
- 互換性: 古いシステムが VS を無視する場合、絵文字がテキスト調で表示される可能性
- 正規化: Unicode 正規化 (NFC, NFD) では VS は維持されるが、NFKC, NFKD では削除される場合がある
よくある誤解
- ❌ 「異体字セレクタは漢字専用」→ ✅ 絵文字 (VS-15/VS-16) や記号にも使う
- ❌ 「VS は表示に影響しない」→ ✅ 表示形の切替が主な役割
- ❌ 「VS-16 を消しても絵文字は同じ」→ ✅ システムによってテキスト調に変わる