引擎盖下的emoji

2021-03-26 20:12:50

在过去的几周内,我一直在为Skija实施Emoji支持。我以为它可能很有趣分享了一些细节的细节,这些细节是如何在引擎盖下工作的“自文的信函的最大创新以来的人类交流创新”。

警告:某些Emoji可能无法在设备上显示。在这种情况下,使用此文本版本:\ _(ツ)_ /

正如您所知,计算机内的所有文本都以数字编码。一个字母 - 一个数字。我们使用的最流行的编码称为Unicode,其中两个最流行的变体称为UTF-8和UTF-16。

Unicode为代码点分配2英寸(〜2密耳)字符。对不起,程序员,但它不是8岁的繁殖。其中200万,实际定义了〜150k个字符。

150K定义的字符涵盖了🌍,许多死语言,很多奇怪的东西,如𝔣𝔲𝔫𝔫𝔶𝔣𝔲𝔫𝔫𝔶,sɹǝʇʇǝluʍop-ǝpᴉsdn,ghz作为一个字形:㎓,“带有双垂直行程的双头箭头的大量奇怪的东西: ⤘,七眼怪物:ꙮ,鸭子:

作为侧面笔记,肯定检查埃及象形文字块(U + 13000-U + 1342F)。他们有一些非常奇怪的东西。

所以,emoji。在最简单的状态下,它们就是:unicode表中的另一个符号。其中大多数都在U + 1F300-1F6FF和U + 1F900-1FAFF中分组。

这就是为什么Emoji表现得像任何其他字母:它们可以在文本字段中键入,复制,粘贴,呈现在纯文本文档中,嵌入在推文等中。当您键入“A”时,计算机会看到U + 0041。当您输入“🌵”时,计算机会看到U + 1F335。没有太大差异。

为什么Emoji呈现为图像?嗯,位图字体。显然,您可以创建一个具有PLYPHS的PNG的字体而不是无聊的黑白矢量形状。

每个操作系统都配有一个用于表情符号的单个预装字体。在MacOS / iOS上,那是Apple Color Emoji。 Windows有Segoe Ui Emoji,Android有诺象彩色emoji。

据我所知,Apple是一个带160×160光栅字形的位图字体,Noto使用128×128位图,Segoe是矢量颜色字体🆒。

这就是为什么Emoji在不同的设备上看起来不同 - 就像字体看起来不同!最重要的是,许多应用程序捆绑了自己的表情符号字体:Whatsapp,Twitter,Facebook。

现在关于渲染。您不会在Apple Color Emoji或Segoe Ui Emoji字体中写下您的文本(除非您真的很年轻,纯净❤️)。所以如何在例如时设置文本。 Helvetica包括emoji?

嗯,与同一机器让西里尔文本在俱乐部房屋或媒体上看起来丑陋:字体回归。

键入,例如,u + 1f419,首先在您当前的字体中抬头。让我们说这是旧金山。旧金山对U + 1F419没有雕文,因此OS开始查找可能拥有的任何其他安装字体。

U + 1F419只能在Apple Color Emoji中找到,因此OS使用它来渲染U + 1F419(文本的其余部分留在您当前的字体中)。到底,你看到♥。这就是为什么,无论您使用哪个字体,Emoji都会看起来相同:

并非所有Emoji都在表情符号代码块中直接开始。事实上,象形图至少自1993年以来为字体和Unicode存在。查看杂项符号U + 2600-26FF和Dingbats U + 2700-27FF:

这些字形与我们使用的任何其他字母一样正常:它们是单码点,黑白,并且许多字体都包含它们。例如,这里是我机器上的所有不同的字体,具有自己版本的✂︎(u + 2702黑色剪刀):

你猜怎么了?当Apple Color Emoji创建时,它有自己的版本相同的U + 2702 CodePoint,它看起来像这样:

现在是为了棘手的部分。操作系统如何知道何时渲染✂︎和当✂️时,如果它们都有相同的代码点,不仅具有Apple Color Emoji的Apple Color Emoji,而且还有许多其他更高优先级的传统字体?

符合U + FE0F,也称为变型选择器-16。它是文本渲染器的提示,用于切换到EMOJI字体。

U + 2702 - ✂︎u+ 2702 u + fe0f - ✂️u+ 2697 - ⚗︎u+ 2697 u + fe0f - ⚗️u+ 26a0 - ⚛︎u+ 26a0 u + fe0f - ⚛️u+ 2618 - ☘︎u+ 2618 u + fe0f - ☘️

简单,优雅,无需在旧的时分配新的代码点。毕竟,像☠︎和☠️一样具有相同的含义,只有演示文稿是不同的。

在这里我们遇到另一个问题 - 我们的表情符号现在不是一个单一的代码点,而是两个。这意味着我们需要一种方法来定义字符边界。

遇见石墨簇。 Grapheme群集是一系列代码点,被认为是单一人类感知的字形。

对于表情群岛而言,图形群也不用于普通字母。 “ü”是单一的图形集群,即使它由两个代码点组成:U + 0055大写U&U + 0308组合过显示。

GraphEme集群为程序员创造了许多并发症。你不能只是做一个子字符串(0,10)拍摄前10个字符 - 你可能会分为一半(或尖锐,所以无论如何)拆分一个emoji)!

逆转字符串是棘手的,而且u + 263a u + fe0f是有意义的,u + fe0f u + 263a没有。

最后,您不能只致电.Length on String。好吧,你可以,但结果会让你感到惊讶。如果您是开发人员,请尝试这个"🤦🏼♂️" .Length在浏览器的控制台中。

程序员提示:如果您正在使用文本,请获取一个图书馆群集的库。对于C,C ++ M和JVM,这将是ICU,Swift为其他人提供了正确的东西,为他人看。

Grapheme集群意识月,有人吗?图形不想拆分!哦,我在开玩笑谁? for(int i = 0; i< str.length; ++ i)str [i] go brrr!

哦,顺便说一句,我提到了这一点:♥也是一个单一的石墨簇簇吗?它的长度为65,它不应该分为一半。睡觉紧张:)

大多数人类表情符号描绘了一个抽象的黄色人。当2015年添加了肤色时,而不是为每个表情符号和肤色组合添加新的Codepoint时,只添加了五个新的CodePoints:🏻🏼🏽🏾🏿U+ 1f3fb..u + 1f3ff。

这些不应该自行使用,而是将其附加到现有的表情符号。它们在一起形成了一个结扎:👋(U + 1F44B挥舞手标志)直接后跟🏽(U + 1F3FD介质肤色修饰器)变为👋🏽。

👋🏽没有自己的代码点(它是两个:u + 1f44b u + 1f3fd的序列),但它有自己独特的外观。只有五个修饰符,〜280人的Emojis变成了1680年的变化。这是一些舞者:

让我们说你的朋友刚给你发了一张苹果的照片,她在她的花园里成长。你需要回复 - 怎么样?您可能会发送一个👩女性Emoji(U + 1F469),然后是A🌾捆(U + 1F33E)。如果你一起把两者放在一起:👩🌾,没有任何反应。这只是两个单独的表情符号。

但!如果你在两者之间加入U + 200d,魔术会发生:转向一个女人的农民。

u + 200d称为零宽的大手,或短的zwj。它与我们用肤色看到的东西类似地工作,但这一次你可以将两个自给自足的表情符号加入其中。并非所有组合工作,但很多人都这样做,有时以惊人的方式!

👩+✈️→👩✈️👨+💻→👨💻👰+♂️→👰♂️🐻+❄️→🐻❄️🏴+☠️→🏴☠️🏳️+🌈→🏳️🌈

我注意到的一个奇怪的不一致就是头发颜色是通过ZWJ完成的,而肤色只是修改器Emoji,没有木匠。为什么?说真的,我问你:为什么?我没有线索。

👨+🏿u+ 1f3ff→👨🏿👨+ zwj +🦰→👨🦰

不幸的是,一些表情符号没有与ZWJ的组合实施。我认为那些失踪的机会:

👨+🦷≠+💀≠🧟👩+🔍≠+👁≠👀💄+👄💋🌂+🌧≠+🌈≠+🐟≠🍣🐈+🦓🐅🦵+🐅🦵 +💪+💪+👂+👂+👃+👅+👀+🧠≠🧍

你是如何键入zwj?你没有。但是你可以从这里复制它:“”。注意:这是一个特殊的角色,所以期望它表现得很奇怪。这也是看不见的。但它在那里。

ZWJ闪耀的另一个大面积是家庭和关系配置。一个简短的故事来说明:

👨🏻+🤝+👨🏼→👨🏻🤝👨🏼👨+ +👨→👨❤️👨👨+❤️+💋+👨→+👨+👧→👨👨 👧👨+👨+👧+👧→👨👨👧👧

国家标志是Unicode标准的一部分,但由于某种原因不会在Windows上实现。如果您在Windows的浏览器中读到这一点 - 我很抱歉!

🇺+🇳=🇺🇳🇷+🇺=🇷🇺🇮+🇸=🇦=🇿🇦🇯+🇵=🇯🇵

但是,他们不使用真正的字母。相反,使用“区域指示符符号字母”字母(U + 1F1E6..1F1FF)。这些字母不用于任何旗帜的任何东西。

如果你汇总了两个随机字母会发生什么?不多:🇽🇾(文本编辑开始表现出奇怪)。

如果您想实验,请随时复制和组合此字母:🇦🇧🇨🇩🇪🇫🇭🇮🇯🇰🇲🇳🇵🇶🇷🇹🇺🇻🇼🇾🇿🇺🇼🇾🇿。有258个有效的双字母组合。你能找到它们吗?

一个有趣的副作用是两个字母的连词:'' .join(逆转('🇺🇦#39;))=> '🇦🇺'

两个字母的韧带很酷,但你不想冷却吗? 32个字母的韧皮怎么样?满足标记序列。

标签序列是一系列正常的表情符号,然后是另一种拉丁字母(U + E0020..e007e)的味道,与U + E007F取消标签终止。

🏴+ gbeng + e007f =🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴+ gbsct + e007f =🏴󠁧󠁢󠁳󠁣󠁴󠁿🏴+ gbwls + e007f =🏴󠁧󠁢󠁷󠁬󠁳󠁿

它如下所示:拿一位数,*或#,用U + FE0F将其变成Emoji,用U + 20E3结合封闭钥匙扣:

#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣7️⃣8 Unicode每年更新,Emoji是每个版本的主要部分。 例如。 在Unicode 13(3月2020年3月)中,添加了55个新的表情符号。 在撰写最新的麦斯科斯州(11.2.3)和iOS(14.4.1)的那一刻,从Unicode 13支持Emoji 😮💨,❤️🔥,🧔♀或👨🏻❤️💋👨🏼 但是,感谢ZWJ的魔力,我仍然可以弄清楚发生了什么,只是不是最佳的方式。 标记序列🏴+ gbsct + u + e007f =🏴󠁧󠁢󠁳󠁣󠁴󠁿 U + 1F6B5🚵人山骑自行车+ U + 1F3FB浅色肤色+ U + 200D ZWJ + U + 2640♀️Female标志+ U + FE0F变化选择器-6 =🚵🏻♀️女人山地自行车:浅色肤色

谷歌的关键字是“GraphEme群集”。 它适用于emoji,对西方语言的陷入困境,到录音和韩国脚本,所以请注意。 那是我的全部了。 我希望更深入地了解引擎盖下的表情符号工作将如何帮助您在您的工作中...... Nah,仅仅开玩笑。 希望你享受它,虽然♥ 我还创建开源的东西:Fira代码,anybar,dataScript和rum。 如果您喜欢我所做的并希望早日访问我的文章(以及其他好处),您应该支持我的帕勒顿。