我在文本字段中输入了两个表情符号,在这里我得到的字符总数为5个字符,而第一个表情符号为4个字符,第二个为1个字符。看起来苹果已经将4个表情符号组合成一个。
我正在寻找可以分别分离每个表情符号的 快速 代码,假设通过上述示例,我应该为每个表情符号分别获取2个字符串/字符。
任何人都可以帮助我解决这个问题吗?我已经尝试了很多事情,例如正则表达式分离或componentsSeparatedByString或characterSet。但不幸的是最终以负数告终。
提前致谢。
Swift 4(Xcode 9)更新
从Swift 4开始(通过Xcode 9 beta测试),“ Emoji ZWJ序列” Character按照Unicode 9标准的要求被视为一个:
Character
let str = "👨👨👧👧😍" print(str.count) // 2 print(Array(str)) // ["👨👨👧👧", "😍"]
也String就是它的字符(再次)的集合,所以我们可以调用str.count得到的长度,并Array(str)把所有的字符数组。
String
str.count
Array(str)
(Swift 3及更早版本的旧答案)
这只是部分答案,在这种情况下可能会有帮助。
“ 👨👨👧👧”确实是四个单独字符的组合:
let str = "👨👨👧👧😍" // print(Array(str.characters)) // Output: ["👨", "👨", "👧", "👧", "😍"]
与U + 200D(零宽度JOINER)粘合在一起:
for c in str.unicodeScalars { print(String(c.value, radix: 16)) } /* Output: 1f468 200d 1f468 200d 1f467 200d 1f467 1f60d */
用.ByComposedCharacterSequences 选项枚举字符串可以正确组合以下字符:
.ByComposedCharacterSequences
var chars : [String] = [] str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) { (substring, _, _, _) -> () in chars.append(substring!) } print(chars) // Output: ["👨👨👧👧", "😍"]
但是在其他情况下,这是行不通的,例如“标志”是“区域指示器字符”的序列(比较计数元素emoji时,SwiftcountElements()返回不正确的值)。用
let str = "🇩🇪"
上面循环的结果是
["🇩", "🇪"]
这不是理想的结果。
完整规则 在Unicode标准的“标准附件#29 UNICODE TEXT SEGMENTATION”的“ 3字素簇边界”中定义。