Emoji 搜尋與使用指南:從 Unicode 編碼到跨平台相容的完整攻略
Emoji 的 Unicode 編碼
編碼範圍
| 範圍 | Unicode 區塊 | 範例 |
|---|---|---|
| U+1F600 - U+1F64F | Emoticons | 😀😁😂 |
| U+1F300 - U+1F5FF | Misc Symbols & Pictographs | 🎨🌟🌀 |
| U+1F680 - U+1F6FF | Transport & Map | 🚀🚗🚲 |
| U+1F900 - U+1F9FF | Supplemental Symbols & Pictographs | 🤖🦊🦁 |
| U+1FA00 - U+1FA6F | Chess Symbols | 🪀🪁🪂 |
| U+1FA70 - U+1FAFF | Symbols & Pictographs Extended-A | 🪩🪫🪬 |
編碼表示法
// Unicode 碼點
console.log('\u{1F600}'); // 😀
console.log('\u{1F680}'); // 🚀
// 碼點查詢
console.log('😀'.codePointAt(0).toString(16)); // "1f600"
// 從碼點建立
String.fromCodePoint(0x1F600); // "😀"
String.fromCodePoint(0x1F680); // "🚀"
UTF-8 編碼長度
// Emoji 在 UTF-8 中佔 4 位元組
new TextEncoder().encode('😀').length; // 4
// 但 .length 回傳 2(代理對)
'😀'.length; // 2
// 正確計算字元數
[...'😀😁😂'].length; // 3
膚色修飾符
5 種膚色
U+1F3FB 🏻 淺膚色 (Light Skin Tone)
U+1F3FC 🏼 中淺膚色 (Medium-Light)
U+1F3FD 🏽 中等膚色 (Medium)
U+1F3FE 🏾 中深膚色 (Medium-Dark)
U+1F3FF 🏿 深膚色 (Dark)
組合方式
基礎 Emoji + 膚色修飾符 = 帶膚色的 Emoji
👨 + 🏽 = 👨🏽
👋 + 🏿 = 👋🏿
// JavaScript 組合
const base = '\u{1F468}'; // 👨
const modifier = '\u{1F3FD}'; // 🏽
const result = base + modifier; // 👨🏽
// 拆解
[...'👨🏽']; // ['👨', '🏽']
零寬連接符(ZWJ)序列
ZWJ(U+200D)將多個 Emoji 組合為一個:
👨 + ZWJ + 🏭 = 👨🏭 (男工廠作業員)
👩 + ZWJ + 💻 = 👩💻 (女技術人員)
👨 + ZWJ + ❤️ + ZWJ + 👨 = 👨❤️👨 (男男情侶)
家庭組合
👨 + ZWJ + 👩 + ZWJ + 👦 = 👨👩👦 (一家三口)
👨 + ZWJ + 👨 + ZWJ + 👧 = 👨👨👧 (兩個爸爸和女兒)
國旗組合
🇨 + 🇭 = 🇨🇭 (瑞士國旗)
🇯 + 🇵 = 🇯🇵 (日本國旗)
🇨 + 🇳 = 🇨🇳 (中國國旗)
國旗 Emoji 由兩個區域指示符號(Regional Indicator)組成。
跨平台顯示差異
| Emoji | Apple | Microsoft | Samsung | ||
|---|---|---|---|---|---|
| 😀 | 😁風格 | 😁風格 | 😁風格 | 😁風格 | 😁風格 |
| 🔫 | 水槍 | 水槍 | 真槍 | 水槍 | 水槍 |
同一個 Emoji 在不同平台外觀不同,但 Unicode 碼點相同。
避免誤解的建議
- 避免有歧義的 Emoji:🔫(槍/水槍)、🍆(蔬菜/暗示)
- 測試多平台顯示:用 Emoji 搜尋工具 查看不同平台渲染
- 正式場合少用:正式郵件/文件中避免使用
- 組合序列注意相容:ZWJ 序列在舊系統可能顯示為多個獨立 Emoji
在程式碼中使用 Emoji
HTML
<!-- 直接使用 -->
<p>歡迎使用 🚀</p>
<!-- Unicode 跳脫 -->
<p>歡迎使用 🚀</p>
<!-- CSS content -->
<style>
.icon::before { content: '\1F680'; }
</style>
JavaScript
// 直接使用(推薦)
const rocket = '🚀';
// Unicode 跳脫
const rocket = '\u{1F680}';
// 在字串中
const message = `部署成功 ${rocket}`;
// 作為物件鍵(不推薦,但可以)
const icons = { '🚀': 'rocket', '🎨': 'art' };
Python
# 直接使用
rocket = '🚀'
# Unicode 跳脫
rocket = '\U0001F680'
# 在 f-string 中
message = f'部署成功 {rocket}'
資料庫儲存
-- MySQL:需要 utf8mb4 字元集
CREATE TABLE messages (
content VARCHAR(500) CHARACTER SET utf8mb4
);
-- ❌ utf8 字元集無法儲存 Emoji
-- ✅ utf8mb4 字元集可以儲存 Emoji
使用工具庫搜尋 Emoji
- 開啟 Emoji 搜尋工具
- 輸入關鍵字(中文或英文)如「開心」
- 查看符合的 Emoji 清單
- 點擊複製到剪貼簿
- 支援依分類瀏覽
搜尋範例
| 關鍵字 | 結果 |
|---|---|
| 開心 | 😄😁😆😊🥰 |
| 火箭 | 🚀🚁🛸 |
| 貓 | 🐱🐈🐈⬛ |
| 食物 | 🍕🍔🍜🍣🍰 |
| 工作 | 💼💻📊📋✏️ |
Emoji 正規表示式
匹配所有 Emoji
// Emoji 正則(簡化版)
const emojiRegex = /\p{Emoji_Presentation}/gu;
// 更完整的版本(包含修飾符和 ZWJ 序列)
const fullEmojiRegex = /\p{Extended_Pictographic}(\u{FE0F})?(\u{1F3FB}-\u{1F3FF})?(\u{200D}\p{Extended_Pictographic}(\u{FE0F})?(\u{1F3FB}-\u{1F3FF})?)*/gu;
// 使用
const text = 'Hello 😀 World 🚀';
const emojis = text.match(fullEmojiRegex);
// ["😀", "🚀"]
移除文字中的 Emoji
function removeEmoji(text: string): string {
return text.replace(/\p{Emoji_Presentation}/gu, '');
}
removeEmoji('Hello 😀 World 🚀'); // "Hello World "
統計 Emoji 數量
function countEmoji(text: string): number {
const matches = text.match(/\p{Emoji_Presentation}/gu);
return matches ? matches.length : 0;
}
常見問題
為什麼 Emoji 顯示為方框 □?
- 字型不支援:系統缺少 Emoji 字型
- 字元集錯誤:資料庫/檔案用了 UTF-8 而非 UTF-8MB4
- 版本過舊:新 Emoji 需要較新的系統版本
Emoji 的 .length 為什麼不是 1?
'😀'.length // 2(代理對)
'👨🏽'.length // 4(基礎 + 修飾符,各佔 2)
'👨👩👦'.length // 8(3個Emoji + 2個ZWJ)
[...'👨👩👦'].length // 5(正確拆解)
// 安全的字串長度
function safeLength(str: string): number {
return [...str].length;
}
如何取得最新 Emoji?
Emoji 每年更新一次(Unicode 版本更新),新 Emoji 需要:
- 作業系統更新(iOS/Android/Windows)
- 瀏覽器更新
- 字型更新(Noto Color Emoji)
總結
Emoji 是 Unicode 標準的一部分,理解其編碼原理(碼點、修飾符、ZWJ 序列)有助於正確處理跨平台相容問題。核心要點:用 utf8mb4 儲存資料庫、用 [...str] 計算字元數、注意跨平台顯示差異。工具庫的 Emoji 搜尋工具 讓你快速找到需要的 Emoji。
#Emoji#表情符号#Unicode#搜索#教程