为什么 isEmoji 实例属性对数字返回 true?

mgy*_*yky 3 string emoji swift

问题

为什么isEmoji实例属性对数字返回 true?

检查下面的示例:

let scalars: [Unicode.Scalar] = ["", "+", "1"]
for s in scalars {
    print(s, "-->", s.properties.isEmoji)
}
Run Code Online (Sandbox Code Playgroud)

结果

//  --> true
// + --> false
// 1 --> true... 
Run Code Online (Sandbox Code Playgroud)

等等什么?

为什么?问题是如何正确使用数字的 isEmoji 属性。

mgy*_*yky 6

什么

\n

如果您不熟悉 isEmoji 实例属性,它是一个布尔值,指示标量是否具有表情符号表示形式,以及它是否是默认值。

\n

它适用于 iOS 10.2+、iPadOS 10.2+、macOS 10.12.2+、Mac Catalyst 10.2+、tvOS 10.1+、watchOS 3.1.1+、visionOS 1.0+ Beta。

\n

遇到这个问题后我做了一些研究,并在Apple的文档中找到了答案。

\n

为什么

\n

最终结果为,因为ASCII 数字有非默认的表情符号呈现;一些平台以另一种外观呈现它们。

\n

由于这种行为,仅在单个标量上测试isEmoji不足以确定文本单元是否呈现为表情符号;正确的测试需要检查字符中的多个\n标量。

\n

除了检查基本标量是否具有 isEmoji == true 之外,您还必须检查其默认呈现(请参阅 isEmojiPresentation)并确定其后面是否跟随会修改呈现的变体选择器。此属性对应于Unicode 标准中的 \xe2\x80\x9cEmoji\xe2\x80\x9d 属性。

\n

解决方案

\n

所以你可以像下面这样检查:

\n
let scalars: [Unicode.Scalar] = ["", "+", "1"]\n\nfor s in scalars {\n    print(s, "-->", (s.properties.isEmoji && s.properties.isEmojiPresentation))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

最终结果

\n
//  --> true\n// + --> false\n// 1 --> false\n
Run Code Online (Sandbox Code Playgroud)\n

\n