为什么红心表情符号需要两个代码点,而其他彩色心形需要一个?

Why does the red heart emoji require two code points, but the other colored hearts require one?

看来红心表情符号 (❤️)“\u2764\uFE0F”需要两个 Unicode 代码点,具体来说 Heavy Black Heart followed by a Variation Selector. However, blue , green , yellow , and purple 每个都有自己的代码点。

为什么红色如此不同?

由于历史原因。最初,只有 U+2764 HEAVY BLACK HEART,第一个支持 Emojis 的应用程序决定将其呈现为红心。这些早期的应用程序总是将 U+2764 渲染为 Emoji。后来意识到这是个坏主意,表情符号的变体选择器被标准化了。添加额外的心形表情符号时,不需要再添加一个红心,因此省略了。相反,有一个单独的黑心表情符号 U+1F5A4 .

理论上,应用程序可能需要将 Emoji 变体选择器也附加到其他心形代码点。但是将 PURPLE HEART 这样的字符渲染为非 Emoji 并没有多大意义。不过,它确实对 HEAVY BLACK HEART 有所影响,它通常旨在呈现为原始的、朴素的沉重黑心角色。

HEAVY BLACK HEART 比表情符号早几十年被添加到 Unicode 中。当表情符号被纳入 Unicode 6 时,一些已经存在的字符被简单地重新用作表情符号,以避免不必要的重复。后来,为也映射到非表情符号字符集的字符定义了变体序列,以便更好地控制它们的显示方式。例如,U+2744 ❄ SNOWFLAKE 最初来自 Zapf Dingbats(我相信),但后来也被制成了表情符号。因此,如果你想强制显示原始文本样式,你可以使用 VARIATION SELECTOR-15(导致 ❄︎),如果你想强制显示较新的表情符号样式,你可以使用 VARIATION SELECTOR-16(导致 ❄️)。

但是请注意,目前真正正确支持这些变体序列的平台并不多。在使用表情符号键盘时,并非所有这些都会自动应用变体选择器。理论上❤和❄(和many other emoji)在没有VS16的情况下应该默认显示为文本样式,但许多应用程序也忽略了这一点。

I have a list of all code points that can display differently via a variation sequence, on my website, if you're interested。 6 月份的下一次 Unicode 更新将添加更多内容。