swift 为什麽emoji示例属性对于数字返回true?

46scxncf  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(95)

问题

为什么isEmojiinstance属性对数字返回true?
检查下面的示例:

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

字符串

结果

// 🤓 --> true
// + --> false
// 1 --> true...


等什么?😦
但是为什么?问题是如何以正确的方式将isEmoji属性用于数字。

gg0vcinb

gg0vcinb1#

什么
如果您不熟悉isEmoji示例属性,它是一个布尔值,指示标量是否具有emoji表示,以及它是否是默认值。
它适用于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。
面对这个问题后我做了一点研究,在Apple's documentation中找到了答案。
为什么
最终结果为true,因为ASCII数字为非默认emoji表示;一些平台用替代外观呈现这些。
由于这种行为,单独在单个标量上测试isEmoji不足以确定文本单元是否被渲染为emoji;正确的测试需要检查字符中的多个 * 标量
除了检查基础标量是否具有isEmoji == true,还必须检查其默认表示(请参阅isEmojiPresentation),并确定它后面是否有一个可以修改表示的变体选择器。此属性对应于Unicode Standard中的“Emoji”属性。

解决方案

所以你可以像下面的行一样检查:

let scalars: [Unicode.Scalar] = ["🤓", "+", "1"]

for s in scalars {
    print(s, "-->", (s.properties.isEmoji && s.properties.isEmojiPresentation))
}

字符串

最终结果

// 🤓 --> true
// + --> false
// 1 --> false


🎉

相关问题