絵文字は何文字? - 1 つの絵文字が 1 文字とは限らない理由
😀 は 1 文字? 👨👩👧👦 (家族の絵文字) は? 実は、見た目は 1 つの絵文字でも、内部的には複数の文字が結合してできているものがあります。X (旧 Twitter) で「あと 1 文字入るはずなのに入らない!」という経験、ありませんか?
絵文字の文字数カウント
| 絵文字 | 見た目 | Unicode の文字数 | UTF-16 の長さ | UTF-8 のバイト数 |
|---|---|---|---|---|
| 😀 | 1 つ | 1 文字 | 2 | 4 バイト |
| 👍 | 1 つ | 1 文字 | 2 | 4 バイト |
| 👍🏽 | 1 つ | 2 文字 | 4 | 8 バイト |
| 👨👩👧👦 | 1 つ | 7 文字 | 11 | 25 バイト |
| 🏳️🌈 | 1 つ | 4 文字 | 6 | 14 バイト |
| 🇯🇵 | 1 つ | 2 文字 | 4 | 8 バイト |
👨👩👧👦 (家族) は、見た目は 1 つの絵文字ですが、内部的には「男性 + 結合文字 + 女性 + 結合文字 + 女の子 + 結合文字 + 男の子」の 7 文字で構成されています。
なぜ絵文字の文字数がバラバラなの?
| 仕組み | 説明 | 例 |
|---|---|---|
| 基本絵文字 | 1 つのコードポイント = 1 文字 | 😀 (U+1F600) |
| 肌の色 | 基本絵文字 + 肌色修飾子 = 2 文字 | 👍🏽 = 👍 + 🏽 |
| ZWJ 結合 | 複数の絵文字を見えない文字でつなぐ | 👨👩👧👦 = 👨 + ZWJ + 👩 + ZWJ + 👧 + ZWJ + 👦 |
| 国旗 | 2 つの地域指示記号の組み合わせ | 🇯🇵 = 🇯 + 🇵 |
ZWJ は「Zero Width Joiner」(幅ゼロの結合子) の略で、画面には表示されないけれど文字数としてはカウントされる特殊な文字です。
SNS での絵文字の文字数カウント
| サービス | 😀 のカウント | 👨👩👧👦 のカウント | カウント方式 |
|---|---|---|---|
| X (旧 Twitter) | 2 文字分 | 7〜11 文字分 | 独自の重み付け |
| 1 文字 | 1 文字 | 見た目の絵文字数 | |
| LINE | 1 文字 | 1 文字 | 見た目の絵文字数 |
| SMS | 絵文字 1 つで 70 文字制限に | 同左 | エンコーディング切替 |
X では絵文字 1 つが 2 文字分としてカウントされます。140 文字の制限で絵文字を多用すると、テキストに使える文字数がどんどん減ります。X の文字数制限の歴史で触れたように、絵文字の扱いは文字数カウントの複雑さを象徴しています。
SMS と絵文字の意外な関係
SMS (ショートメッセージ) は、絵文字を 1 つ入れるだけで文字数制限が大きく変わります。
| 条件 | 1 通あたりの文字数 | エンコーディング |
|---|---|---|
| 英数字のみ | 160 文字 | GSM-7 (7 ビット) |
| 日本語のみ | 70 文字 | UCS-2 (16 ビット) |
| 絵文字を含む | 70 文字 | UCS-2 に切り替わる |
英語の SMS は 1 通 160 文字ですが、絵文字を 1 つ入れるだけで UCS-2 エンコーディングに切り替わり、70 文字に減ります。絵文字 1 つのために 90 文字分の容量を失うのです。
絵文字の数は増え続けている
| 年 | Unicode バージョン | 絵文字の総数 | 追加された主な絵文字 |
|---|---|---|---|
| 2010 | 6.0 | 約 720 | 基本的な顔、動物、食べ物 |
| 2015 | 8.0 | 約 1,620 | 肌の色のバリエーション |
| 2020 | 13.0 | 約 3,300 | 忍者、タピオカ、ビーバー |
| 2024 | 16.0 | 約 3,790 | 木の実、指紋、スプラッター |
絵文字は毎年増え続けていて、2024 年時点で約 3,790 種類。最初の携帯電話の絵文字 (1999 年、NTT ドコモ) は 176 種類でした。25 年で 20 倍以上に増えたことになります。
プログラミングと絵文字の文字数
プログラミングで絵文字の文字数を正しく数えるのは、実はとても難しい問題です。
| 言語 | "👨👩👧👦".length の結果 | 理由 |
|---|---|---|
| JavaScript | 11 | UTF-16 のコードユニット数 |
| Python | 7 | Unicode コードポイント数 |
| Swift | 1 | 書記素クラスタ数 (見た目の文字数) |
同じ絵文字なのに、プログラミング言語によって「長さ」が 1、7、11 と全く違う結果になります。文字数とバイト数の違いの応用問題として、絵文字は最も複雑なケースの 1 つです。
絵文字や Unicode に関する書籍は Amazon でも探せます。