絵文字→コードポイント変換の使い方|U+・サロゲート・ZWJの仕組み
公開日:2026年9月17日 更新日:2026年9月15日 運営:シルギア(Analyzegear, Inc.) 対象ツール:絵文字→コードポイント変換
「絵文字→コードポイント変換」は、絵文字や文字列を書記素(見た目1文字)ごとに分解し、各コードポイントの U+XXXX・10進・UTF-16サロゲートペア・UTF-8バイト列・名称を並べて表示するツールです。文字化けの原因調査や絵文字を含む入力のデバッグで「この絵文字は内部でどんな並びなのか」を確認したいときに役立ちます。処理はすべてブラウザ内で完結し、入力内容はサーバーへ送信されません。この記事では、絵文字が複数の部品でできている仕組みを実際の数値例とともに解説します。
コードポイントとは何か(U+XXXX)
Unicodeは、世界中の文字や記号ひとつひとつに固有の番号を割り当てています。この番号がコードポイントで、慣例として「U+」に続けて16進数で書きます。たとえば笑顔の絵文字「😀」はコードポイント U+1F600 が1つ割り当てられています。U+1F600 を10進に直すと、1×16⁴+15×16³+6×16²=65536+61440+1536=128512 です。ツールの各ブロックにはこの U+ 表記と10進の両方が表示されます。
コードポイントはあくまで「番号」であり、メモリやファイルに保存するときはさらにバイト列へ変換(符号化)する必要があります。この符号化方式が UTF-16 と UTF-8 で、同じコードポイントでも表現が変わります。
UTF-16サロゲートペアとUTF-8バイト列
UTF-16は、原則1文字を16bit(2バイト)で表しますが、U+FFFF を超える文字はこの枠に収まりません。そこで上位(High)と下位(Low)の2つの16bitに分割して表す仕組みがサロゲートペアです。「😀」(U+1F600)は UTF-16 では D83D と DE00 の2つのコード単位になります。計算は、まず 0x1F600 から 0x10000 を引いて 0xF600、上位が 0xD800+(0xF600≫10)=D83D、下位が 0xDC00+(0xF600&0x3FF)=DE00 です。BMP内(U+FFFF以下)の文字はサロゲートにならず、たとえば「❤」(U+2764)は 2764 の1つだけです。ツールはサロゲートペアになるコードポイントに「UTF-16(サロゲート)」と明示します。
UTF-8は1〜4バイトの可変長で、Webやファイルで最も一般的な方式です。「😀」は UTF-8 では F0 9F 98 80 の4バイトになります。多くの絵文字は UTF-8 で4バイト、UTF-16でサロゲートペア(2コード単位=4バイト)です。一方、記号寄りの「❤」(U+2764)は UTF-8 では E2 9D A4 の3バイトです。
なぜ見た目の文字数と合わないのか
ここで大事なのが、人が「1文字」と感じる書記素と、Unicodeのコードポイントは別物だという点です。ツールは上部の概要に「書記素◯個/コードポイント◯個」を表示します。「😀」は書記素1・コードポイント1で一致しますが、後述の合成絵文字では大きくずれます。JavaScriptの文字列は内部がUTF-16なので、`"😀".length` は1ではなく2になります。サロゲートペアの2コード単位をそのまま数えてしまうためで、絵文字を含む文字列の長さ制限や切り詰め処理でよく起きる不具合の原因です。ツールは書記素の分割に Intl.Segmenter を使い、未対応の環境ではコードポイント単位へ自動でフォールバックします。「見た目の個数」で数えたいなら length ではなく書記素単位で扱う必要がある、という判断材料になります。
ZWJシーケンスと肌色修飾子
絵文字の合成には、いくつかの不可視の部品が使われます。代表がZWJ(U+200D・ゼロ幅接合子)です。複数の絵文字をZWJでつなぐと、対応環境では1つの合成絵文字として表示されます。家族絵文字「👨👩👧」は、男性(U+1F468)・ZWJ(U+200D)・女性(U+1F469)・ZWJ(U+200D)・女の子(U+1F467)という5つのコードポイントでできています。見た目は1文字(書記素1)ですが、コードポイントは5個。この差が、文字数カウントで最も直感に反する例です。ツールはこのブロックに「ZWJシーケンス(3個の絵文字をZWJで連結)」と注記します。
肌色修飾子は、人物や手の絵文字の肌の色を6段階(Fitzpatrick)で変える文字で、U+1F3FB〜U+1F3FF の範囲です。直前の絵文字のすぐ後ろに1つ付けます。「👍🏽」は、親指アップ(U+1F44D)+肌色修飾子 TYPE-4(U+1F3FD)の2コードポイントです。修飾子は単独では意味を持たず、必ず直前の人物絵文字に作用します。
異体字セレクタ・国旗・キーキャップ
異体字セレクタ VS16(U+FE0F)は、直前の文字をカラー絵文字として表示させる指示で、それ自体は目に見えません。「❤️」は、ハート(U+2764)+VS16(U+FE0F)の2コードポイントです。VS16が付かない「❤」は、環境によって白黒のテキスト字形で表示されることがあります。逆にテキスト表示を指定する VS15(U+FE0E)もあります。
国旗は、地域指標記号(Regional Indicator、U+1F1E6〜U+1F1FF)というA〜Zに対応する専用文字を2つ並べて、ISOの国コードを表します。「🇯🇵」は J(U+1F1EF)と P(U+1F1F5)の組み合わせで、それぞれ UTF-16 では D83C DDEF と D83C DDF5 になります。対応フォントが無い環境では、2文字のアルファベット風の記号に見えることがあります。
キーキャップは、数字や記号を囲みキーにする結合文字 U+20E3 を使います。「1️⃣」は、数字の1(U+0031)+VS16(U+FE0F)+キーキャップ(U+20E3)の3コードポイントです。ベースが半角数字(1バイト)なのに、修飾で見た目が絵文字化している点が読み取れます。
使い方と実務での活用
入力欄に調べたい絵文字や文字列を貼り付けると、概要に書記素とコードポイントの個数が出て、書記素ごとのブロックに各コードポイントの U+・10進・UTF-16・UTF-8・JS用エスケープが並びます。ブロック見出しの注記で、ZWJシーケンス・肌色修飾子・国旗・異体字セレクタなど「複数コードポイントの連なり」かどうかが分かります。「例を入れる」ボタン(😀/👍🏽/🇯🇵/👨👩👧/❤️/1️⃣)で代表的なパターンをすぐ試せます。
下部の「出力フォーマット」からは、コードポイント列(U+)・JS文字列リテラル(\u{...} 形式)・HTML実体参照(10進 😀 /16進 😀)をワンタップでコピーできます。実装にそのまま貼れるので、絵文字を含むテストデータの用意や直書きに便利です。実務では、データベースが utf8mb4 でないと4バイト絵文字を保存できず文字化けする、といったトラブルの切り分けにも使えます。名称データは代表的な文字のみ内蔵でその他はブロック名で代替されますが、U+コードポイントは常に正確です。最新の割り当ては Unicode の公式情報を優先して確認してください。