ios - 判断字符串中的字符是否是表情符号?

标签 ios string swift character emoji

我需要找出字符串中的字符是否是表情符号。

比如我有这个角色:

let string = "😀"
let character = Array(string)[0]

我需要查明该字符是否是表情符号。

最佳答案

我偶然发现的是字符、unicode 标量和字形之间的区别。

例如,字形👨‍👨‍👧‍👧由7个unicode标量组成:

  • 四个表情符号字符:👨👩👧👧
  • 在每个表情符号之间是一个特殊的字符,就像字符胶一样;见the specs for more info

另一个例子,字形 👌🏿 由 2 个 unicode 标量组成:

  • 常规表情符号:👌
  • 肤色调节剂:🏿

最后一个,字形 1️⃣ 包含三个 unicode 字符:

因此在渲染字符时,生成的字形非常重要。

Swift 5.0 及更高版本使这个过程变得更加容易,并且摆脱了我们需要做的一些猜测。 Unicode.Scalar的新Property类型有助于确定我们正在处理的内容。 然而,这些属性只有在检查字形中的其他标量时才有意义。这就是为什么我们要向 Character 类添加一些方便的方法来帮助我们。

更多详情,I wrote an article explaining how this works .

对于 Swift 5.0,这会给您留下以下结果:

extension Character {
    /// A simple emoji is one scalar and presented to the user as an Emoji
    var isSimpleEmoji: Bool {
        guard let firstScalar = unicodeScalars.first else { return false }
        return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
    }

    /// Checks if the scalars will be merged into an emoji
    var isCombinedIntoEmoji: Bool { unicodeScalars.count > 1 && unicodeScalars.first?.properties.isEmoji ?? false }

    var isEmoji: Bool { isSimpleEmoji || isCombinedIntoEmoji }
}

extension String {
    var isSingleEmoji: Bool { count == 1 && containsEmoji }

    var containsEmoji: Bool { contains { $0.isEmoji } }

    var containsOnlyEmoji: Bool { !isEmpty && !contains { !$0.isEmoji } }

    var emojiString: String { emojis.map { String($0) }.reduce("", +) }

    var emojis: [Character] { filter { $0.isEmoji } }

    var emojiScalars: [UnicodeScalar] { filter { $0.isEmoji }.flatMap { $0.unicodeScalars } }
}

这将为您提供以下结果:

"A̛͚̖".containsEmoji // false
"3".containsEmoji // false
"A̛͚̖▶️".unicodeScalars // [65, 795, 858, 790, 9654, 65039]
"A̛͚̖▶️".emojiScalars // [9654, 65039]
"3️⃣".isSingleEmoji // true
"3️⃣".emojiScalars // [51, 65039, 8419]
"👌🏿".isSingleEmoji // true
"🙎🏼‍♂️".isSingleEmoji // true
"🇹🇩".isSingleEmoji // true
"⏰".isSingleEmoji // true
"🌶".isSingleEmoji // true
"👨‍👩‍👧‍👧".isSingleEmoji // true
"🏴󠁧󠁢󠁳󠁣󠁴󠁿".isSingleEmoji // true
"🏴󠁧󠁢󠁥󠁮󠁧󠁿".containsOnlyEmoji // true
"👨‍👩‍👧‍👧".containsOnlyEmoji // true
"Hello 👨‍👩‍👧‍👧".containsOnlyEmoji // false
"Hello 👨‍👩‍👧‍👧".containsEmoji // true
"👫 Héllo 👨‍👩‍👧‍👧".emojiString // "👫👨‍👩‍👧‍👧"
"👨‍👩‍👧‍👧".count // 1

"👫 Héllœ 👨‍👩‍👧‍👧".emojiScalars // [128107, 128104, 8205, 128105, 8205, 128103, 8205, 128103]
"👫 Héllœ 👨‍👩‍👧‍👧".emojis // ["👫", "👨‍👩‍👧‍👧"]
"👫 Héllœ 👨‍👩‍👧‍👧".emojis.count // 2

"👫👨‍👩‍👧‍👧👨‍👨‍👦".isSingleEmoji // false
"👫👨‍👩‍👧‍👧👨‍👨‍👦".containsOnlyEmoji // true

For older Swift versions, check out this gist containing my old code.

关于ios - 判断字符串中的字符是否是表情符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757193/

相关文章:

ios - 无法确定要启动的模拟器设备。 - Xcode

ios - 如何将代码执行移至主队列

ios - 正则表达式中的多个 ????'s 导致错误

string - 获取 .trim/-trim、.replace/-replace、.split/-split 和其他字符串运算符的帮助

ios - 来自 ViewController 外部的 Alamofire 请求

ios - 如何使用自动布局以编程方式修复 tableview 单元格上的附件按钮

python - 从列表中获取特定长度的字符串

c++ - 提取符号之间的字符串

swift - 带闭包的属性初始化

swift - 基于按下按钮在同一个 TableView Controller 中加载不同的数组