我需要找出字符串中的字符是否是表情符号。
比如我有这个角色:
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/