如何分离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这个有趣的文章。