表情符號字元圖
使用程式碼瀏覽和複製表情符號
如何使用表情符號字元圖
- 1輸入或貼上含 emoji / 特殊符號的文本。
- 2檢視每個字元的 Unicode 碼點(U+XXXX)與 UTF-8 編碼。
- 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 按「字素簇」切分**,而不是按碼位。
| Emoji | Unicode | UTF-8 位元組 | UTF-16 長度 |
|---|---|---|---|
| 😀 | U+1F600 | 4 位元組 | 2(代理對) |
| ❤️ | U+2764 U+FE0F | 6 位元組 | 3 |
| 👍 | U+1F44D | 4 位元組 | 2 |
| 👨👩👧 | 3 個 emoji + 2 ZWJ | 18 位元組 | 8 |
| 🇨🇳 | U+1F1E8 U+1F1F3 | 8 位元組 | 4 |
| 👍🏽 | U+1F44D U+1F3FD | 8 位元組 | 4 |
| é | U+00E9 | 2 位元組 | 1 |
| 中 | U+4E2D | 3 位元組 | 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 規範中標記為「支援膚色」的才行,否則修飾符會單獨顯示成一個色塊。
