HaoEmoji

文本样式与 Emoji 样式:同一个字符为何有 “两幅面孔”?

作者:遇松

你有没有碰到一个问题,你复制了一个Emoji,但是粘贴出来却变成了黑白的。同一个字符为什么会有两幅面孔,一个是黑白的,一个是彩色的。这里面有什么门道?

字符怎么显示到底是有谁决定的

一个字符怎么显示是不确定的,可能显示为黑白的普通字符,也可能显示为彩色的Emoji。这而是由渲染引擎、当前字体以及字符在 Unicode 标准中的默认呈现属性共同决定的。比如在纯文本环境中,就会显示为黑白的普通字符,而在聊天软件中,就会显示为彩色的Emoji。 为了消除这种不确定性,明确指定显示那种样式,我们需要在字符后面增加一个特殊字符,告诉系统怎么显示。

变体选择符:字符的“样式开关”

这个能让字符显示不同样式的特殊字符就是“变体选择符”。变体选择符通常是不可见的,你看不到它的存在。

变体选择符包括两个:

  • U+FE0E (变体选择符-15 / VS15):强制将字符显示为文本样式(通常是黑白、单一颜色)。
  • U+FE0F (变体选择符-16 / VS16):强制将字符显示为Emoji样式(通常是彩色、图像化)。

举个例子,笑脸符号“☺”的编码是 U+263A。添加不同的变体选择符后,显示效果如下:

基础字符 变体选择符 显示效果 样式说明
U+263A U+FE0E 文本样式
U+263A U+FE0F ☺️ Emoji样式

在Emoji出现之前,Unicode联盟就已经收录了大量的符号类字符(如:☹︎ ☺︎ ♠︎ ♣︎ ♥︎ ♦︎)。比如这个笑脸“☺”符号,跟后来的Emoji ☺️撞脸了。所以 Unicode联盟在设计 Emoji 编码的的时候没有重新设计一个,而是借用这个笑脸的编码。方法就是增加一个特殊的字符来实现Emoji。可以理解为在原来黑白的字符后面,增加一个修饰符,就变成了彩色的Emoji。这样做既保留了历史数据的向下兼容,又满足了现代设备的视觉表达需求,真是一个巧妙的设计。

特殊情况

还有一类特殊字符:键帽符号,包括 #、* 以及数字 0–9。 这类字符跟普通符号不一样:只加 U+FE0F 只能变成彩色符号,不能变成Emoji。 想要显示成 #️⃣、1️⃣ 这种键盘按钮样式,必须用三段组合:原始字符 + U+FE0F(强制 Emoji) + U+20E3(结合用封闭键帽符) U+20E3 是一个专门的包裹型特殊字符,作用就是给前方字符套上方形按键边框;它不能单独显示,只能依附在前一个字符上,这也是键帽 Emoji 必须多一个后缀的原因。

编码序列 显示效果 说明
U+0023 # 普通文本字符
U+0023 + U+FE0F #️ 强制 Emoji 样式(无键帽,仅颜色变化)
U+0023 + U+20E3 #⃣ 键帽效果,但可能是黑白/单色
U+0023 + U+FE0F + U+20E3 #️⃣ 完整的彩色键帽 Emoji

所有普通字符和Emoji对照表

编码 字符 文本样式 Emoji样式
0023 # #︎ #️⃣
002A * *︎ *️⃣
0030 0 0︎ 0️⃣
0031 1 1︎ 1️⃣
0032 2 2︎ 2️⃣
0033 3 3︎ 3️⃣
0034 4 4︎ 4️⃣
0035 5 5︎ 5️⃣
0036 6 6︎ 6️⃣
0037 7 7︎ 7️⃣
0038 8 8︎ 8️⃣
0039 9 9︎ 9️⃣
00A9 © ©︎ ©️
00AE ® ®︎ ®️
203C ‼︎ ‼️
2049 ⁉︎ ⁉️
2122 ™︎ ™️
2139 ℹ︎ ℹ️
2194 ↔︎ ↔️
2195 ↕︎ ↕️
2196 ↖︎ ↖️
2197 ↗︎ ↗️
2198 ↘︎ ↘️
2199 ↙︎ ↙️
21A9 ↩︎ ↩️
21AA ↪︎ ↪️
231A ⌚︎ ⌚️
231B ⌛︎ ⌛️
2328 ⌨︎ ⌨️
23CF ⏏︎ ⏏️
23E9 ⏩︎ ⏩️
23EA ⏪︎ ⏪️
23EB ⏫︎ ⏫️
23EC ⏬︎ ⏬️
23ED ⏭︎ ⏭️
23EE ⏮︎ ⏮️
23EF ⏯︎ ⏯️
23F0 ⏰︎ ⏰️
23F1 ⏱︎ ⏱️
23F2 ⏲︎ ⏲️
23F3 ⏳︎ ⏳️
23F8 ⏸︎ ⏸️
23F9 ⏹︎ ⏹️
23FA ⏺︎ ⏺️
24C2 Ⓜ︎ Ⓜ️
25AA ▪︎ ▪️
25AB ▫︎ ▫️
25B6 ▶︎ ▶️
25C0 ◀︎ ◀️
25FB ◻︎ ◻️
25FC ◼︎ ◼️
25FD ◽︎ ◽️
25FE ◾︎ ◾️
2600 ☀︎ ☀️
2601 ☁︎ ☁️
2602 ☂︎ ☂️
2603 ☃︎ ☃️
2604 ☄︎ ☄️
260E ☎︎ ☎️
2611 ☑︎ ☑️
2614 ☔︎ ☔️
2615 ☕︎ ☕️
2618 ☘︎ ☘️
261D ☝︎ ☝️
2620 ☠︎ ☠️
2622 ☢︎ ☢️
2623 ☣︎ ☣️
2626 ☦︎ ☦️
262A ☪︎ ☪️
262E ☮︎ ☮️
262F ☯︎ ☯️
2638 ☸︎ ☸️
2639 ☹︎ ☹️
263A ☺︎ ☺️
2640 ♀︎ ♀️
2642 ♂︎ ♂️
2648 ♈︎ ♈️
2649 ♉︎ ♉️
264A ♊︎ ♊️
264B ♋︎ ♋️
264C ♌︎ ♌️
264D ♍︎ ♍️
264E ♎︎ ♎️
264F ♏︎ ♏️
2650 ♐︎ ♐️
2651 ♑︎ ♑️
2652 ♒︎ ♒️
2653 ♓︎ ♓️
265F ♟︎ ♟️
2660 ♠︎ ♠️
2663 ♣︎ ♣️
2665 ♥︎ ♥️
2666 ♦︎ ♦️
2668 ♨︎ ♨️
267B ♻︎ ♻️
267E ♾︎ ♾️
267F ♿︎ ♿️
2692 ⚒︎ ⚒️
2693 ⚓︎ ⚓️
2694 ⚔︎ ⚔️
2695 ⚕︎ ⚕️
2696 ⚖︎ ⚖️
2697 ⚗︎ ⚗️
2699 ⚙︎ ⚙️
269B ⚛︎ ⚛️
269C ⚜︎ ⚜️
26A0 ⚠︎ ⚠️
26A1 ⚡︎ ⚡️
26A7 ⚧︎ ⚧️
26AA ⚪︎ ⚪️
26AB ⚫︎ ⚫️
26B0 ⚰︎ ⚰️
26B1 ⚱︎ ⚱️
26BD ⚽︎ ⚽️
26BE ⚾︎ ⚾️
26C4 ⛄︎ ⛄️
26C5 ⛅︎ ⛅️
26C8 ⛈︎ ⛈️
26CE ⛎︎ ⛎️
26CF ⛏︎ ⛏️
26D1 ⛑︎ ⛑️
26D3 ⛓︎ ⛓️
26D4 ⛔︎ ⛔️
26E9 ⛩︎ ⛩️
26EA ⛪︎ ⛪️
26F0 ⛰︎ ⛰️
26F1 ⛱︎ ⛱️
26F2 ⛲︎ ⛲️
26F3 ⛳︎ ⛳️
26F4 ⛴︎ ⛴️
26F5 ⛵︎ ⛵️
26F7 ⛷︎ ⛷️
26F8 ⛸︎ ⛸️
26F9 ⛹︎ ⛹️
26FA ⛺︎ ⛺️
26FD ⛽︎ ⛽️
2702 ✂︎ ✂️
2705 ✅︎ ✅️
2708 ✈︎ ✈️
2709 ✉︎ ✉️
270A ✊︎ ✊️
270B ✋︎ ✋️
270C ✌︎ ✌️
270D ✍︎ ✍️
270F ✏︎ ✏️
2712 ✒︎ ✒️
2714 ✔︎ ✔️
2716 ✖︎ ✖️
271D ✝︎ ✝️
2721 ✡︎ ✡️
2728 ✨︎ ✨️
2733 ✳︎ ✳️
2734 ✴︎ ✴️
2744 ❄︎ ❄️
2747 ❇︎ ❇️
274C ❌︎ ❌️
274E ❎︎ ❎️
2753 ❓︎ ❓️
2754 ❔︎ ❔️
2755 ❕︎ ❕️
2757 ❗︎ ❗️
2763 ❣︎ ❣️
2764 ❤︎ ❤️
2795 ➕︎ ➕️
2796 ➖︎ ➖️
2797 ➗︎ ➗️
27A1 ➡︎ ➡️
27B0 ➰︎ ➰️
27BF ➿︎ ➿️
2934 ⤴︎ ⤴️
2935 ⤵︎ ⤵️
2B05 ⬅︎ ⬅️
2B06 ⬆︎ ⬆️
2B07 ⬇︎ ⬇️
2B1B ⬛︎ ⬛️
2B1C ⬜︎ ⬜️
2B50 ⭐︎ ⭐️
2B55 ⭕︎ ⭕️
3030 〰︎ 〰️
303D 〽︎ 〽️
3297 ㊗︎ ㊗️
3299 ㊙︎ ㊙️
1F004 🀄 🀄︎ 🀄️
1F170 🅰 🅰︎ 🅰️
1F171 🅱 🅱︎ 🅱️
1F17E 🅾 🅾︎ 🅾️
1F17F 🅿 🅿︎ 🅿️
1F202 🈂 🈂︎ 🈂️
1F21A 🈚 🈚︎ 🈚️
1F22F 🈯 🈯︎ 🈯️
1F237 🈷 🈷︎ 🈷️
1F30D 🌍 🌍︎ 🌍️
1F30E 🌎 🌎︎ 🌎️
1F30F 🌏 🌏︎ 🌏️
1F315 🌕 🌕︎ 🌕️
1F31C 🌜 🌜︎ 🌜️
1F321 🌡 🌡︎ 🌡️
1F324 🌤 🌤︎ 🌤️
1F325 🌥 🌥︎ 🌥️
1F326 🌦 🌦︎ 🌦️
1F327 🌧 🌧︎ 🌧️
1F328 🌨 🌨︎ 🌨️
1F329 🌩 🌩︎ 🌩️
1F32A 🌪 🌪︎ 🌪️
1F32B 🌫 🌫︎ 🌫️
1F32C 🌬 🌬︎ 🌬️
1F336 🌶 🌶︎ 🌶️
1F378 🍸 🍸︎ 🍸️
1F37D 🍽 🍽︎ 🍽️
1F393 🎓 🎓︎ 🎓️
1F396 🎖 🎖︎ 🎖️
1F397 🎗 🎗︎ 🎗️
1F399 🎙 🎙︎ 🎙️
1F39A 🎚 🎚︎ 🎚️
1F39B 🎛 🎛︎ 🎛️
1F39E 🎞 🎞︎ 🎞️
1F39F 🎟 🎟︎ 🎟️
1F3A7 🎧 🎧︎ 🎧️
1F3AC 🎬 🎬︎ 🎬️
1F3AD 🎭 🎭︎ 🎭️
1F3AE 🎮 🎮︎ 🎮️
1F3C2 🏂 🏂︎ 🏂️
1F3C4 🏄 🏄︎ 🏄️
1F3C6 🏆 🏆︎ 🏆️
1F3CA 🏊 🏊︎ 🏊️
1F3CB 🏋 🏋︎ 🏋️
1F3CC 🏌 🏌︎ 🏌️
1F3CD 🏍 🏍︎ 🏍️
1F3CE 🏎 🏎︎ 🏎️
1F3D4 🏔 🏔︎ 🏔️
1F3D5 🏕 🏕︎ 🏕️
1F3D6 🏖 🏖︎ 🏖️
1F3D7 🏗 🏗︎ 🏗️
1F3D8 🏘 🏘︎ 🏘️
1F3D9 🏙 🏙︎ 🏙️
1F3DA 🏚 🏚︎ 🏚️
1F3DB 🏛 🏛︎ 🏛️
1F3DC 🏜 🏜︎ 🏜️
1F3DD 🏝 🏝︎ 🏝️
1F3DE 🏞 🏞︎ 🏞️
1F3DF 🏟 🏟︎ 🏟️
1F3E0 🏠 🏠︎ 🏠️
1F3ED 🏭 🏭︎ 🏭️
1F3F3 🏳 🏳︎ 🏳️
1F3F5 🏵 🏵︎ 🏵️
1F3F7 🏷 🏷︎ 🏷️
1F408 🐈 🐈︎ 🐈️
1F415 🐕 🐕︎ 🐕️
1F41F 🐟 🐟︎ 🐟️
1F426 🐦 🐦︎ 🐦️
1F43F 🐿 🐿︎ 🐿️
1F441 👁 👁︎ 👁️
1F442 👂 👂︎ 👂️
1F446 👆 👆︎ 👆️
1F447 👇 👇︎ 👇️
1F448 👈 👈︎ 👈️
1F449 👉 👉︎ 👉️
1F44D 👍 👍︎ 👍️
1F44E 👎 👎︎ 👎️
1F453 👓 👓︎ 👓️
1F46A 👪 👪︎ 👪️
1F47D 👽 👽︎ 👽️
1F4A3 💣 💣︎ 💣️
1F4B0 💰 💰︎ 💰️
1F4B3 💳 💳︎ 💳️
1F4BB 💻 💻︎ 💻️
1F4BF 💿 💿︎ 💿️
1F4CB 📋 📋︎ 📋️
1F4DA 📚 📚︎ 📚️
1F4DF 📟 📟︎ 📟️
1F4E4 📤 📤︎ 📤️
1F4E5 📥 📥︎ 📥️
1F4E6 📦 📦︎ 📦️
1F4EA 📪 📪︎ 📪️
1F4EB 📫 📫︎ 📫️
1F4EC 📬 📬︎ 📬️
1F4ED 📭 📭︎ 📭️
1F4F7 📷 📷︎ 📷️
1F4F9 📹 📹︎ 📹️
1F4FA 📺 📺︎ 📺️
1F4FB 📻 📻︎ 📻️
1F4FD 📽 📽︎ 📽️
1F508 🔈 🔈︎ 🔈️
1F50D 🔍 🔍︎ 🔍️
1F512 🔒 🔒︎ 🔒️
1F513 🔓 🔓︎ 🔓️
1F549 🕉 🕉︎ 🕉️
1F54A 🕊 🕊︎ 🕊️
1F550 🕐 🕐︎ 🕐️
1F551 🕑 🕑︎ 🕑️
1F552 🕒 🕒︎ 🕒️
1F553 🕓 🕓︎ 🕓️
1F554 🕔 🕔︎ 🕔️
1F555 🕕 🕕︎ 🕕️
1F556 🕖 🕖︎ 🕖️
1F557 🕗 🕗︎ 🕗️
1F558 🕘 🕘︎ 🕘️
1F559 🕙 🕙︎ 🕙️
1F55A 🕚 🕚︎ 🕚️
1F55B 🕛 🕛︎ 🕛️
1F55C 🕜 🕜︎ 🕜️
1F55D 🕝 🕝︎ 🕝️
1F55E 🕞 🕞︎ 🕞️
1F55F 🕟 🕟︎ 🕟️
1F560 🕠 🕠︎ 🕠️
1F561 🕡 🕡︎ 🕡️
1F562 🕢 🕢︎ 🕢️
1F563 🕣 🕣︎ 🕣️
1F564 🕤 🕤︎ 🕤️
1F565 🕥 🕥︎ 🕥️
1F566 🕦 🕦︎ 🕦️
1F567 🕧 🕧︎ 🕧️
1F56F 🕯 🕯︎ 🕯️
1F570 🕰 🕰︎ 🕰️
1F573 🕳 🕳︎ 🕳️
1F574 🕴 🕴︎ 🕴️
1F575 🕵 🕵︎ 🕵️
1F576 🕶 🕶︎ 🕶️
1F577 🕷 🕷︎ 🕷️
1F578 🕸 🕸︎ 🕸️
1F579 🕹 🕹︎ 🕹️
1F587 🖇 🖇︎ 🖇️
1F58A 🖊 🖊︎ 🖊️
1F58B 🖋 🖋︎ 🖋️
1F58C 🖌 🖌︎ 🖌️
1F58D 🖍 🖍︎ 🖍️
1F590 🖐 🖐︎ 🖐️
1F5A5 🖥 🖥︎ 🖥️
1F5A8 🖨 🖨︎ 🖨️
1F5B1 🖱 🖱︎ 🖱️
1F5B2 🖲 🖲︎ 🖲️
1F5BC 🖼 🖼︎ 🖼️
1F5C2 🗂 🗂︎ 🗂️
1F5C3 🗃 🗃︎ 🗃️
1F5C4 🗄 🗄︎ 🗄️
1F5D1 🗑 🗑︎ 🗑️
1F5D2 🗒 🗒︎ 🗒️
1F5D3 🗓 🗓︎ 🗓️
1F5DC 🗜 🗜︎ 🗜️
1F5DD 🗝 🗝︎ 🗝️
1F5DE 🗞 🗞︎ 🗞️
1F5E1 🗡 🗡︎ 🗡️
1F5E3 🗣 🗣︎ 🗣️
1F5E8 🗨 🗨︎ 🗨️
1F5EF 🗯 🗯︎ 🗯️
1F5F3 🗳 🗳︎ 🗳️
1F5FA 🗺 🗺︎ 🗺️
1F610 😐 😐︎ 😐️
1F687 🚇 🚇︎ 🚇️
1F68D 🚍 🚍︎ 🚍️
1F691 🚑 🚑︎ 🚑️
1F694 🚔 🚔︎ 🚔️
1F698 🚘 🚘︎ 🚘️
1F6AD 🚭 🚭︎ 🚭️
1F6B2 🚲 🚲︎ 🚲️
1F6B9 🚹 🚹︎ 🚹️
1F6BA 🚺 🚺︎ 🚺️
1F6BC 🚼 🚼︎ 🚼️
1F6CB 🛋 🛋︎ 🛋️
1F6CD 🛍 🛍︎ 🛍️
1F6CE 🛎 🛎︎ 🛎️
1F6CF 🛏 🛏︎ 🛏️
1F6E0 🛠 🛠︎ 🛠️
1F6E1 🛡 🛡︎ 🛡️
1F6E2 🛢 🛢︎ 🛢️
1F6E3 🛣 🛣︎ 🛣️
1F6E4 🛤 🛤︎ 🛤️
1F6E5 🛥 🛥︎ 🛥️
1F6E9 🛩 🛩︎ 🛩️
1F6F0 🛰 🛰︎ 🛰️
1F6F3 🛳 🛳︎ 🛳️

普通字符应该显示为黑白的,但你看到的可能是彩色的Emoji。如前文所述,你的环境可能会影响字符显示样式。