我在文本字段中输入了两个表情符号,这里我得到的总长度为5个字符,而第一个表情符号则为4个字符,第二个表情符号为1个字符。看起来苹果已经将4个表情符号组合成一个表情符号。
我正在寻找 swift 代码,我可以单独分离每个表情符号,假设通过上面的例子我应该为每个表情符号分别获得2个字符串/字符。
任何人都可以帮我解决这个问题,我尝试了很多东西,如正则表达式分离或componentsSeparatedByString或characterSet。但不幸的是最终结果是消极的。
提前致谢。
答案 0 :(得分:3)
更新Swift 4(Xcode 9)
截至Swift 4(使用Xcode 9 beta测试),“表情符号ZWJ序列”是
被视为Unicode 9标准规定的单Character
:
let str = ""
print(str.count) // 2
print(Array(str)) // ["", ""]
同样String
是其角色的集合(再次),所以我们可以
调用str.count
获取长度,Array(str)
获取所有内容
字符作为数组。
(Swift 3及更早版本的旧答案)
这只是部分答案,可能有助于这种特殊情况。
“”确实是四个独立字符的组合:
let str = "" //
print(Array(str.characters))
// Output: ["", "", "", "", ""]
用U + 200D(ZERO WIDTH JOINER)胶合在一起:
for c in str.unicodeScalars {
print(String(c.value, radix: 16))
}
/* Output:
1f468
200d
1f468
200d
1f467
200d
1f467
1f60d
*/
使用.ByComposedCharacterSequences
枚举字符串
选项正确组合这些字符:
var chars : [String] = []
str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) {
(substring, _, _, _) -> () in
chars.append(substring!)
}
print(chars)
// Output: ["", ""]
但是还有其他情况,这不起作用, 例如“旗帜”是一系列“区域指标” 字符“(比较Swift countElements() return incorrect value when count flag emoji)。用
let str = ""
上述循环的结果是
["", ""]
这不是理想的结果。
完整规则在"3 Grapheme Cluster Boundaries"中定义 在“标准附件#29 UNICODE TEXT SEGMENTATION”中 Unicode标准。
答案 1 :(得分:1)
要在Swift中使用它,请将类别导入YourProject_Bridging_Header
#import "NSString+EMOEmoji.h"
然后你可以检查字符串中每个表情符号的范围:
let example: NSString = "" // your string
let ranges: NSArray = example.emo_emojiRanges() // ranges of the emojis
for value in ranges {
let range:NSRange = (value as! NSValue).rangeValue
print(example.substringWithRange(range))
}
// Output: ["", ""]
I created an small example project with the code above.
进一步阅读,这篇来自Instagram的有趣文章。