絵文字

Unicode に収録された絵文字記号。テキストコミュニケーションで感情や概念を視覚的に表現する。

絵文字 (Emoji) は Unicode に収録された絵文字記号で、テキストコミュニケーションにおいて感情や概念を視覚的に表現するために使われます。もともと 1999 年に日本の携帯電話キャリア (NTT ドコモ) が導入したもので、2010 年に Unicode 6.0 で国際標準に採用されました。2024 年時点で Unicode には 3,000 以上の絵文字が登録されており、毎年新しい絵文字が追加されています。

絵文字の内部構造は見た目以上に複雑です。多くの絵文字は基本多言語面 (BMP) の外に配置されているため、UTF-16 ではサロゲートペアとして 2 コードユニットを消費します。さらに、肌の色を変える修飾子 (Emoji Modifier)、性別を指定する ZWJ (ゼロ幅接合子) シーケンス、国旗を表す Regional Indicator Symbol など、複数のコードポイントを組み合わせて 1 つの絵文字を構成する仕組みが多数存在します。たとえば「👨‍👩‍👧‍👦」(家族) は 7 つのコードポイント (4 人の人物 + 3 つの ZWJ) で構成されています。絵文字と Unicode の書籍で詳しく学べます。

エンコーディングごとのバイト数も異なります。UTF-8 では基本的な絵文字は 4 バイトを消費しますが、ZWJ シーケンスを含む複合絵文字はそれ以上になります。データベースの VARCHAR 列に絵文字を格納する場合、MySQL では utf8mb4 エンコーディングが必要です (utf8 は 3 バイトまでしか対応しないため絵文字を格納できません)。この制約を知らずにデータベースを設計すると、絵文字を含むデータの保存時にエラーが発生する典型的な落とし穴です。

SNS の文字数制限における絵文字の扱いはプラットフォームによって異なります。X (旧 Twitter) では絵文字 1 つを 2 文字としてカウントします。Instagram のキャプションでは 1 文字扱いです。SMS では絵文字を含むメッセージは Unicode エンコーディングに切り替わるため、1 通あたりの文字数上限が 160 文字から 70 文字に減少します。マーケティングやコミュニケーション設計において、この違いを把握しておくことは重要です。

プログラミングにおける絵文字の扱いには注意が必要です。JavaScript の .length プロパティはサロゲートペアを 2 としてカウントするため、絵文字 1 つが 2 以上の長さを返すことがあります。正確な絵文字の文字数を得るには、Array.from()Intl.Segmenter を使って書記素クラスタ単位でカウントする必要があります。SNS コミュニケーションの書籍でも絵文字の効果的な使い方が紹介されています。

文字数カウントの観点では、絵文字は「1 文字に見えて複数文字」の代表例です。コードポイント数、UTF-16 コードユニット数、バイト数、書記素クラスタ数のいずれでカウントするかによって結果が大きく異なります。文字数カウントツールを実装する際には、ユーザーが期待する「見た目の 1 文字」と内部表現のギャップを適切に処理することが求められます。