在 Emoji 後按一次退格鍵,它通常會整個消失,因此很自然地被視為一個字元。但在底層,同一張圖可能由一個、兩個甚至更多碼位組成。
Unicode 有幾個容易混淆的層次:
- 碼位是 U+1F52C 這樣的編號位置;
- 編碼字元是分配給該位置的抽象物件;
- 字素叢集是使用者通常視為一個文字單位的序列;
- 字形是字型或 Emoji 圖庫最後畫出的樣子。
它們常常一一對應,到了 Emoji 卻明顯分開。
一顆愛心可以是文字,也可以是 Emoji
♥ 是 U+2665 BLACK HEART SUIT,❤ 是 U+2764 HEAVY BLACK HEART。這些歷史符號在現代彩色 Emoji 出現前就已存在。
Unicode 使用看不見的變體選擇符請求顯示方式:
- U+FE0E(Variation Selector-15)要求文字樣式;
- U+FE0F(Variation Selector-16)要求 Emoji 樣式。
所以 ❤︎ 是 U+2764 加 U+FE0E,而 ❤️ 是 U+2764 加 U+FE0F。選擇符不是第二張圖片,而是告訴排版系統如何呈現前一個字元。
如果 App 忽略選擇符或缺少 Emoji 支援,彩色愛心可能退回黑白符號。這是顯示差異,不代表文字一定損壞。
膚色是一個修飾符
Emoji 膚色以 Fitzpatrick 分型為基礎,編碼成修飾字元。可接受修飾的人物或身體部位 Emoji 後方,可以接上一個膚色修飾符。
例如 👋🏽 包含:
- U+1F44B WAVING HAND SIGN;
- U+1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4。
系統辨識後會畫成一隻手;不支援時,也可能把基本手勢與膚色色塊分開顯示。
看不見的黏著劑叫 ZWJ
U+200D ZERO WIDTH JOINER 是隱形格式字元。在 Emoji ZWJ 序列裡,它要求排版系統把相鄰 Emoji 組成支援的圖形。
👩🔬 包含:
👩WOMAN;- U+200D ZERO WIDTH JOINER;
🔬MICROSCOPE。
支援序列的系統會畫出女科學家;不支援時可能顯示一位女性和一個顯微鏡。邏輯文字仍然存在,合成字形則取決於字型與平台。
家庭與關係 Emoji 可能連接多個人物、愛心、親吻、性別符號與膚色修飾符。一枚緊湊圖示,底層可能像一小句碼位組成的句子。
旗幟又用了另一種方法
多數國家或地區旗幟由兩個區域指示符組成。例如日本國旗使用對應 J 與 P 的兩個指示符。
碼位並未編碼日本國旗圖片,而是編碼地區序列;支援 Emoji 的系統可以把它畫成旗幟,不支援時常會顯示兩個框中字母。
部分地區旗幟使用黑旗、隱形標籤字元與結束標籤。按鍵 Emoji 則結合數字或符號、可選顯示選擇符及 U+20E3 COMBINING ENCLOSING KEYCAP。Emoji 是一組編碼配方,不是小圖片資料夾。
「長度」取決於你數的是什麼
程式可以問:
- 儲存了多少 UTF-16 碼元?
- 包含多少 Unicode 碼位?
- 游標應移過多少字素叢集?
- 排版系統畫了多少字形?
答案可能完全不同。按任意碼元切割會拆壞代理對;按碼位切割也可能把膚色或變體選擇符與基本字元分開。好的文字軟體會依 Unicode 字素叢集規則處理游標、選取、刪除與長度限制。
因此「使用者名稱最多 20 個字元」還需要定義計數方式。
為何各平台仍畫得不一樣?
Unicode 標準化的是身分與序列行為,不是唯一插畫。Apple、Google、Microsoft、Samsung 等廠商繪製自己的字形,就像不同字型會畫出不同版本的 A。
同一序列代表同一編碼概念,但姿勢、顏色、細節與情緒仍可能不同。
螢幕上的「一枚 Emoji」最好理解為一個字素叢集,不一定是一個碼位。
從Emoji 表情組合複製家庭、職業、旗幟或愛心到上方顯微鏡,就能看見其中的隱形部分。