带有肤色的表情符号如何在内部表示?

Ben*_*Ben -25 unicode codepoint emoji

我正在编写一个处理表情符号的计算机程序。我对如何在内部表示表情符号变体感兴趣。

诸如这些竖起大拇指的表情符号看起来是同一个字符,但具有不同的特征,例如肤色。此外,这些字符似乎占用了相对大量的内存:

console.log('a'.length) // 1
console.log(''.length) // 4
Run Code Online (Sandbox Code Playgroud)

这些字符在内部是如何表示的?

Ben*_*Ben 6

TLDR

在 Unicode 中,带有肤色的表情符号是一种变体形式,为基本字符呈现不同的描述(字形)。

一个表情符号,例如中深肤色的竖起大拇指 () 是由一个由基本字符(竖起大拇指 )组成的字素形成的,紧随其后的是一个变体选择器 非间距标记(中-深色肤色)。

细节

“”中有多少个字符?

一。

一的Unicode定义字符为:

(1) 书面语言中具有语义价值的最小成分;指的是抽象的含义和/或形状,而不是特定的形状(另见字形),尽管在代码表中,某种形式的视觉表示对于读者的理解是必不可少的。(2) 抽象字符的同义词。(3) Unicode 字符编码的基本编码单位。(4) 源自中国的表意文字的英文名称。

"" 具有单一的、不可分割的抽象含义(“竖起大拇指”),因此符合单个字符的定义。


“”中有多少个字素?

一。

一的Unicode定义石墨烯是:

(1) 在特定书写系统的上下文中的最小独特的书写单位。例如,‹b›和‹d›在英语书写系统中是不同的字素,因为存在像big和dig这样的不同词。相反,小写斜体字母 a 和小写罗马字母 a 不是不同的字素,因为没有根据这两种不同形式区分单词。(2) 用户认为的角色。

存在一个字素:竖起符号 (U+1F44D),后跟一个非间距标记:中深肤色变化选择器(U+1F3FE)。变体选择器指示应该使用不同的字形来描绘基本字符

这种基本字符(字素基础)和变体选择器的组合称为字素。请注意,变体选择器不会像重音一样组合标记。

来自关于组合的 Unicode 规范部分

一个字素簇通常从一个字素基础​​开始,然后延伸到任何后续的非间距标记序列。字素簇与文本渲染和处理(例如编辑中的光标放置和文本选择)最直接相关,但也可能与比较和搜索相关。

和,

对于许多进程,一个字素簇表现得好像它是一个与它的字素基础具有相同属性的单个字符。实际上,非间距标记以图形方式应用于基础,但不会更改其属性。

所以,在这个例子中,我们有一个字素和一个非间距标记组成一个字素来制作一个字形(对特定字符的描述):

 +  makes 
Run Code Online (Sandbox Code Playgroud)

“”中有多少个代码点?

二。

代码点的 Unicode 定义是:

(1) Unicode 代码空间中的任何值;即 0 到 10FFFF16 的整数范围。(请参阅第 3.4 节,字符和编码中的定义 D10。)并非所有代码点都分配给编码字符。请参阅代码点类型。(2) 字符的值或位置,在任何编码字符集中。

这里我们有两个来自 Unicode 代码空间的值,所以我们有两个代码点。

在 JavaScript 中,String#[Symbol.Iterator]迭代代码点,使我们能够“看到”代码点:


“”中有多少个代码单元?

四个(在 UTF-16 中)。

代码单元是编码代码点的一部分的存储单元。

该字符中的两个码位都需要超过 16 位来表示,因此在 UTF-16 中,每个码位有两个码位,总共有四个码位。

\ud83d\udc4d\ud83c\udffe
Run Code Online (Sandbox Code Playgroud)


“”中有多少个字节?

八。

在 UTF-16 中,有四个 16 位代码单元,在这个字符中占 8 个字节。


"" 中有多少个代理对?

二。

代理对用于 UTF-16。该术语指的是由 2 个代码单元组成的序列,它们共同形成一个代码点。

UTF-16 是可变宽度的 2 字节或 4 字节字符编码。代码点(字符)根据代码点编号以 2 字节或 4 字节编码。

对于 0x0 和 0xFFFF(即 0 到 65,536)之间的代码点,可以在单个代码单元(16 位)中对代码点进行编码。对于 0x10000 和 0x10FFFF 之间的代码点,代码点需要 2 个代码单元(一个 16 位高字和一个 16 位低字)。

在 UTF-16 中,两个代码单元一起形成所谓的代理对。

两个16 位代码单元的代理对,形成两个代码点。

  • 不过,链接的文章不是 Unicode 标准的一部分,该标准将代理对定义为“由两个 16 位代码单元的序列组成的单个抽象字符的表示,其中该对的第一个值是高位” -代理代码单元,第二个值是低代理代码单元”。这里有两对这样的代码单元,唯一美中不足的是,这似乎意味着该序列必须由两个抽象字符组成,而表情符号似乎只有一个 - 但这并没有真正改变替代计数。 (2认同)