絵文字の直後でBackspaceを押すと、多くの場合は一度で消えます。そのため1文字のように感じますが、同じ絵でも内部では1個、2個、あるいはもっと長いコードポイント列になっています。
Unicodeでは次の単位を区別します。
- コードポイント:U+1F52Cのような番号付きの位置
- 符号化文字:その位置に割り当てられた抽象的な文字
- 書記素クラスタ:利用者が通常1つの文字単位と感じる列
- グリフ:フォントや絵文字セットが描く形
普段は一致しやすい単位ですが、絵文字では大きく分かれます。
ハートは文字にも絵文字にもなる
♥ はU+2665 BLACK HEART SUIT、❤ はU+2764 HEAVY BLACK HEARTです。どちらもカラー絵文字より古い記号です。
Unicodeは見えない異体字セレクタで表示方法を指定します。
- U+FE0E(Variation Selector-15)はテキスト表示
- U+FE0F(Variation Selector-16)は絵文字表示
❤︎ はU+2764の後にU+FE0E、❤️ はU+FE0Fを置いたものです。セレクタは2枚目の絵ではなく、直前の文字をどう表示するかという指示です。
アプリが指示を無視したり対応フォントがなかったりすると、白黒のハートになる場合があります。表示の違いであって、文字が壊れたとは限りません。
肌の色は修飾子
絵文字の肌色はFitzpatrick分類をもとにした修飾文字です。対応する人物や身体部位の絵文字の後に1つ置きます。
👋🏽 は次の2文字です。
- U+1F44B WAVING HAND SIGN
- U+1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4
対応システムは組を認識して1つの手として描きます。未対応なら手と色の修飾子が別々に見えることがあります。
見えない接着剤、ZWJ
U+200D ZERO WIDTH JOINERは見えない書式文字です。絵文字ZWJシーケンスでは、左右の絵文字を対応済みのデザインへ結合するよう求めます。
👩🔬 の中身は次のとおりです。
👩WOMAN- U+200D ZERO WIDTH JOINER
🔬MICROSCOPE
対応システムは女性の科学者を描きます。未対応なら女性と顕微鏡を並べて表示します。論理的な文字列は保たれ、完成した合成グリフだけがフォントと端末の能力に依存します。
家族や関係を表す絵文字は、複数の人物、ハート、キス、性別記号、肌色を結ぶことがあります。小さな1アイコンが、コードポイントで書かれた短い文のような構造を持つのです。
旗には別の作り方がある
多くの国旗は2つの地域指示記号で構成されます。日本国旗なら J と P に対応する地域指示記号の組です。
コードポイントに日の丸の画像が入っているわけではありません。地域を表す列を、対応システムが旗として描きます。未対応環境では2つの囲み英字に見えます。
一部の地域旗は黒旗と見えないタグ文字を使い、キーキャップ絵文字は数字、任意の異体字セレクタ、U+20E3 COMBINING ENCLOSING KEYCAPを組み合わせます。絵文字は小画像のフォルダではなく、複数の符号化レシピです。
「長さ」は何を数えるかで変わる
- UTF-16コード単位はいくつか
- Unicodeコードポイントはいくつか
- カーソルが進む書記素クラスタはいくつか
- 描画されたグリフはいくつか
答えはすべて違う場合があります。コード単位で分割するとサロゲートペアが壊れ、コードポイントで分割しても肌色やセレクタを基本文字から切り離します。文字入力、選択、削除、上限判定にはUnicodeの書記素クラスタ規則が必要です。
画面上の「1つの絵文字」は、1コードポイントではなく1つの書記素クラスタと考えるのが適切です。
絵文字セットから家族、職業、旗、ハートをコピーして顕微鏡に貼ると、見えない構成要素を確認できます。