首页 > 解决方案 > Swift 5 isEmoji 方法为数字返回 true?

问题描述

就像下面的示例一样,isEmoji方法为数字返回true

let scalars: [Unicode.Scalar] = ["", "+", "1"]
for s in scalars {
    print(s, "-->", s.properties.isEmoji)
}
//  --> true
// + --> false
// 1 --> true... wait what? 

但是在我的示例中,为什么以及如何确定最后一种情况。

标签: swiftstringemoji

解决方案


遇到这个问题后,我做了一点搜索,并在Apple 的文档中找到了答案。我与您分享,以免您将来浪费宝贵的时间:

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

由于这种行为,仅在单个标量上测试isEmoji不足以确定文本单元是否呈现为表情符号;正确的测试需要检查一个字符中的多个 标量。除了检查基本标量是否具有 isEmoji == true 之外,您还必须检查其默认表示形式(请参阅 isEmojiPresentation)并确定它后面是否有会修改表示形式的变体选择器。此属性对应于Unicode 标准中的“表情符号”属性。

解决方案

因此,您可以像下面的行一样检查:

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

推荐阅读