表情符號字元圖

使用程式碼瀏覽和複製表情符號

如何使用表情符號字元圖

  1. 1輸入或貼上含 emoji / 特殊符號的文本。
  2. 2檢視每個字元的 Unicode 碼點(U+XXXX)與 UTF-8 編碼。
  3. 3可複製碼點或實體形式用於程式碼與文件。

Emoji 與 Unicode:碼點怎麼看

碼點表示:U+1F600(😀);UTF-8 位元組:0xF0 0x9F 0x98 0x80

每個 emoji 和字元在 Unicode 裡都有唯一『碼點』,形如 U+1F600。很多 emoji 實際由多個碼點組合(如膚色、零寬連線符 ZWJ),所以長度不等於可見字元數。

UTF-8 是網頁最常用編碼,把碼點變成 1–4 個位元組。代理對(surrogate pair)讓 BMP 之外的字元能在 UTF-16 裡表示——這也是為什麼 JS 裡 '😀'.length 是 2。

本工具把文本拆成字元並列出碼點與位元組,方便除錯『為什麼截斷/亂碼/長度不對』這類問題。

Emoji 的複雜性遠超想像:一個「視覺上的 emoji」可能由多個 Unicode 碼位組成。家庭 emoji 👨‍👩‍👧 實際是「男人 + ZWJ + 女人 + ZWJ + 女孩」共 5 個碼位(ZWJ 是零寬連線符 U+200D);國旗 🇨🇳 是兩個「區域指示符」字母組合;膚色是基礎 emoji 加膚色修飾符。**這意味著用 length 判斷長度、用索引擷取都可能把一個 emoji 拆碎成亂碼。**

儲存 emoji 時最容易踩的坑是資料庫字元集:MySQL 的 utf8 實際只支援 3 位元組(BMP 字元),**存 4 位元組的 emoji 會報錯或截斷**,必須用 utf8mb4。同理,UTF-16 環境下(JavaScript、Java、C#)emoji 佔 2 個 char(代理對),所以 '👍'.length === 2,'\u{1F44D}'.length 也是 2(此處為轉義寫法)。**處理 emoji 時要用 Array.from() 或 Intl.Segmenter 按「字素簇」切分**,而不是按碼位。

EmojiUnicodeUTF-8 位元組UTF-16 長度
😀U+1F6004 位元組2(代理對)
❤️U+2764 U+FE0F6 位元組3
👍U+1F44D4 位元組2
👨‍👩‍👧3 個 emoji + 2 ZWJ18 位元組8
🇨🇳U+1F1E8 U+1F1F38 位元組4
👍🏽U+1F44D U+1F3FD8 位元組4
éU+00E92 位元組1
中U+4E2D3 位元組1

Emoji 編碼與位元組長度

常見問題

為什麼 emoji 算兩個字元?

超出基本多文種平面(BMP)的字元在 UTF-16 中用代理對錶示,JS 字串按 UTF-16 單元計數,所以 length 為 2。

碼點和 UTF-8 編碼有什麼區別?

碼點是字元在 Unicode 表中的編號(邏輯);UTF-8 是該編號在網路/檔案裡的位元組表示(物理)。一個碼點可對應 1–4 位元組。

為什麼有時 emoji 顯示成方框?

系統或字型缺少該 emoji 字形,就會回退成方框/問號。與編碼無關,是字型覆蓋問題。

為什麼我的 emoji 存進資料庫變成問號?

九成是字元集問題。MySQL 需要:① 資料庫、表、欄位的字元集都改成 utf8mb4;② 排序規則用 utf8mb4_unicode_ci(或 MySQL 8 的 utf8mb4_0900_ai_ci);③ 連線字元集也設為 utf8mb4(SET NAMES utf8mb4)。三者缺一不可。MySQL 的「utf8」是殘缺的 3 位元組實現,這是一個歷史遺留的坑,8.0 已預設 utf8mb4 但仍需檢查存量表。

怎麼給 emoji 加膚色和變體?

膚色用 5 個菲茨帕特里克修飾符(U+1F3FB 到 U+1F3FF,從淺到深)緊跟在支援膚色的 emoji 後面,如 👍 + U+1F3FD = 👍🏽。變體選擇符控制顯示樣式:U+FE0F 強制顯示為彩色 emoji,U+FE0E 強制顯示為黑白文本樣式(如 ❤️ vs ❤︎)。注意不是所有 emoji 都支援這些修飾——只有 Emoji 規範中標記為「支援膚色」的才行,否則修飾符會單獨顯示成一個色塊。

更多工具