如何分离emojisinput(通过默认键盘)文本字段

我在文本框中input了两个表情符号,在这里我得到的总长度是5个字符,而第一个表情符号是4个字符,第二个是1个字符。 看起来苹果已经结合了4个表情符号组成了一个。

我正在寻找可以单独分离每个表情符号的swift代码,假设通过上面的示例,我应该为每个表情符号分别获取2个string/字符。

任何人都可以帮助我解决这个问题,我已经尝试了很多东西像正则expression式分离或componentsSeparatedByString或characterSet。 但不幸的是结果是负面的。

提前致谢。

Swift 4(Xcode 9)的更新

从Swift 4开始(使用Xcode 9 betatesting),“Emoji ZWJ Sequence”按照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选项枚举string可以正确地组合这些字符:

 var chars : [String] = [] str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) { (substring, _, _, _) -> () in chars.append(substring!) } print(chars) // Output: ["👨‍👨‍👧‍👧", "😍"] 

但也有其他情况下,这是行不通的,例如“旗”是一个“区域指标字符”序列(比较Swift countElements()计数标志表情符号时返回不正确的值 )。 同

 let str = "🇩🇪" 

上面的循环的结果是

 ["🇩", "🇪"] 

这不是理想的结果。

完整规则在Unicode标准的“标准附录#29 UNICODE文本分割”的“3字形群集边界”中定义。

您可以使用此代码示例或此窗格 。

要在Swift中使用它,请将类别导入到YourProject_Bridging_Header

 #import "NSString+EMOEmoji.h" 

然后,您可以检查string中每个表情符号的范围:

 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: ["👨‍👨‍👧‍👧", "😍"] 

我用上面的代码创build了一个小例子项目。

为了进一步阅读,从Instagram这个有趣的文章。