絵文字の仕組み|Unicodeのコードポイント・肌色・ZWJ合字をやさしく解説
絵文字は、ただの小さな絵ではなく、Unicodeという文字の世界共通ルールの上に組み立てられた「文字」です。本記事では、絵文字のもとになるコードポイント、サロゲートペア、肌色の異体字、ZWJで複数の絵文字をつなげる合字の仕組み、環境による見た目の違い、そして文字数カウントがずれる理由までをやさしく解説します。
スマートフォンで何気なく使っている😀や👍といった絵文字。実はこれらは、ただの画像ではなく、アルファベットや漢字とまったく同じ「文字」として扱われています。その土台にあるのが、世界中の文字に番号を割り振るUnicodeという仕組みです。本記事では、絵文字がどんな番号でできているのか、肌色や家族の絵文字はどうやって組み立てられているのか、そしてなぜ「1文字のはずなのに文字数が増える」といった現象が起きるのかを、順を追って解説します。
絵文字とは何か:Unicodeの上にある文字
絵文字は、見た目こそ小さな絵ですが、コンピュータの内部では文字の一種として保存・処理されています。世界中の文字(アルファベット、漢字、ハングル、記号など)には、それぞれ固有の番号が割り当てられており、その番号の体系がUnicodeです。絵文字もこのUnicodeに正式に登録されているため、メールやSNS、ファイル名など、文字が使えるところならどこでも使えます。
つまり絵文字は、画像ファイルを貼り付けているのではなく、「この番号の文字を表示してください」という指示が送られているだけです。受け取った側の端末が、その番号に対応する絵を描いて表示します。だからこそ、同じ絵文字でもiPhoneとAndroid、Windowsで微妙に見た目が違う、という現象が起こります。実際にどんな絵文字が登録されているかは、絵文字ピッカーツールで一覧を眺めてみると、その数の多さに驚くはずです。
コードポイントと符号位置
Unicodeが各文字に割り当てている番号をコードポイント(符号位置)と呼びます。コードポイントは通常、「U+」に続けて16進数で表記します。たとえば笑顔の絵文字😀はU+1F600、親指を立てた👍はU+1F44Dです。アルファベットの「A」がU+0041であるのと、まったく同じ仕組みで番号が振られています。
Unicodeは膨大な数の文字を収めるため、コードポイントの範囲をいくつかの区画(プレーン)に分けています。基本的な文字の多くはU+0000〜U+FFFFの基本多言語面(BMP)に収まりますが、絵文字の多くはそれを超えたU+1F300〜U+1FAFFあたりの追加多言語面に配置されています。番号が大きい領域に置かれていることが、後で説明する「文字数のずれ」とも関係してきます。
ある絵文字や記号がどのコードポイントなのかを調べたいときは、Unicodeインスペクタツールに文字を貼り付ければ、U+で始まる番号を一つひとつ確認できます。見慣れた絵文字が、実は複数の番号の組み合わせでできていることも、ここで見えてきます。
サロゲートペアとバイト数
絵文字の番号は、なぜ普通の文字より「重い」のでしょうか。鍵となるのがサロゲートペアという仕組みです。これは、JavaScriptなどで使われるUTF-16という方式で、BMPを超える大きなコードポイントを表すときに使われます。
UTF-16では、1つの単位(16ビット)でU+0000〜U+FFFFの範囲しか表せません。そこで、😀(U+1F600)のようにこの範囲を超える文字は、2つの単位を組み合わせて1文字を表現します。この2つ1組のペアがサロゲートペアです。結果として、見た目は1文字でも、内部では2単位ぶんのデータとして扱われます。
- 「A」(U+0041):1単位で表せる。プログラムからは長さ1に見える。
- 「😀」(U+1F600):サロゲートペアで2単位。プログラムによっては長さ2に見える。
この「人間には1文字、機械には2つぶん」というズレが、文字数カウントの落とし穴の正体です。フォームの入力制限やSNSの字数制限で、絵文字を入れた途端にカウントが大きく進んでしまうのは、このサロゲートペアが理由になっていることが多いのです。
肌色の異体字とバリエーション
絵文字には、同じ手や顔でも肌の色を選べるものがあります。👍だけでなく👍🏻👍🏽👍🏿のように、色の違うバリエーションが用意されているのを見たことがあるでしょう。これは、別々の絵文字がそれぞれ用意されているのではなく、肌色を指定する専用の文字(肌色修飾子)を後ろにくっつけることで実現されています。
肌色修飾子はU+1F3FB〜U+1F3FFの5種類が用意されており、肌の色合いを表す5段階に対応します。たとえば👍(U+1F44D)の直後に中間の肌色修飾子(U+1F3FD)を置くと、システムはこの2つを合わせて「中間色の親指アップ」として1つの絵に描きます。これも、複数のコードポイントが組み合わさって1つの見た目になる例です。
このほか、絵文字には異体字セレクタという、表示の仕方を切り替える文字も存在します。同じ記号でも、後ろにU+FE0Fが付くと「カラフルな絵文字」として、付かないと「モノクロの記号」として描き分けられることがあります。見た目はほぼ同じでも内部のコードポイント列が違う、というケースは珍しくありません。気になる絵文字をUnicodeインスペクタツールで分解すると、こうした隠れた修飾子の存在に気づけます。
ZWJ合字:絵文字をつなげる仕組み
👨👩👧👦のような家族の絵文字や、👩💻のような職業の絵文字は、どうやって作られているのでしょうか。これらは、複数の絵文字をZWJ(ゼロ幅接合子、U+200D)という「のり」でつなげた合字(ごうじ)です。
ZWJは、それ自体は何も表示しない幅ゼロの特殊な文字です。たとえば「男性(👨)+ ZWJ + 女性(👩)+ ZWJ + 女の子(👧)+ ZWJ + 男の子(👦)」という並びを送ると、対応している端末はこれらをひとまとめにして「家族」という1つの絵として表示します。同様に「女性(👩)+ ZWJ + パソコン(💻)」で「技術者の女性」になります。
重要なのは、ZWJ合字に対応していない環境では、つなげた絵文字がバラバラに表示されるという点です。家族の絵文字が、端末によっては「人と人が並んだだけ」に見えることがあるのはこのためです。1つの絵に見えても、内部では複数の絵文字とZWJが連なった長い列になっているので、文字数も見た目以上に多くなります。
環境差と文字数カウントへの影響
ここまで見てきたように、絵文字は「1つの番号=1つの絵」とは限りません。サロゲートペア、肌色修飾子、異体字セレクタ、ZWJ合字といった仕組みが組み合わさるため、見た目は1文字でも、内部では複数のコードポイント・複数の単位でできていることがよくあります。これが、文字数カウントを難しくしている最大の理由です。
| 絵文字 | 内部の構成 | カウントのされ方の例 |
|---|---|---|
| A | 1コードポイント | 1文字 |
| 😀 | 1コードポイント(サロゲートペアで2単位) | 2と数えられることがある |
| 👍🏽 | 絵文字+肌色修飾子 | 4と数えられることがある |
| 👨👩👧👦 | 4つの絵文字+3つのZWJ | 11と数えられることがある |
つまり、SNSやフォームの「○文字まで」という制限で絵文字を使うと、想定よりずっと早く上限に達することがあります。これは不具合ではなく、絵文字が複数の文字の組み合わせでできているという仕組み上の必然です。逆に言えば、内部構造を知っていれば「なぜか文字数が合わない」という混乱を避けられます。
また、同じコードポイント列でも、それを絵としてどう描くかは端末メーカーやフォントに委ねられています。だからこそ、同じ絵文字がプラットフォームごとに違う表情に見えたり、新しい絵文字が古い端末では「□」や「?」に見えたりするのです。実際にどんな番号の組み合わせなのかを確かめたいときはUnicodeインスペクタツールで分解し、入力したい絵文字を探すときは絵文字ピッカーツールを使うと、仕組みを目で見て理解できます。
なお本記事は一般的な情報の提供を目的としたものです。Unicodeの規格や対応状況は継続的に更新されており、対応する絵文字や表示は環境によって異なります。正確な仕様は最新の公式情報(Unicode Consortiumの資料など)を確認してください。
よくある質問
絵文字は画像ですか、それとも文字ですか?
絵文字は画像ではなく「文字」です。世界中の文字に番号を割り当てるUnicodeという仕組みに正式に登録されており、内部では「この番号の文字を表示してください」という指示として扱われます。受け取った端末が、その番号に対応する絵を描いて表示するため、同じ絵文字でも端末によって見た目が変わります。
コードポイントとは何ですか?
コードポイント(符号位置)とは、Unicodeが各文字に割り当てている固有の番号のことです。通常「U+」に続けて16進数で表記し、たとえば笑顔の絵文字😀はU+1F600です。アルファベットの「A」がU+0041であるのと同じ仕組みで、絵文字にも番号が振られています。
なぜ絵文字を入れると文字数が増えるのですか?
絵文字の多くはサロゲートペアという仕組みで内部的に2単位ぶんとして扱われ、さらに肌色修飾子やZWJ合字が加わると複数のコードポイントの組み合わせになるためです。見た目は1文字でも、機械からは複数文字に見えることがあり、その結果として字数制限に早く達することがあります。
家族や肌色の絵文字はどう作られているのですか?
肌色付きの絵文字は、元の絵文字の後ろに肌色を指定する専用の修飾子(U+1F3FB〜U+1F3FF)を付けて作られます。家族の絵文字は、複数の絵文字をZWJ(ゼロ幅接合子、U+200D)でつなげた合字です。対応する端末では1つの絵としてまとまり、非対応の端末では分かれて表示されます。
絵文字の入力や解析をするとき、データはサーバーに送信されますか?
WAZA TOOLSの絵文字ピッカーツールやUnicodeインスペクタツールはすべてブラウザ内で処理され、入力した文字やコピーした絵文字がサーバーに送信・保存されることはありません。スマートフォンでも利用でき、何度でも無料でお使いいただけます。