一尘不染

如何分隔在文本字段上输入的表情符号(通过默认键盘)

swift

我在文本字段中输入了两个表情符号,在这里我得到的字符总数为5个字符,而第一个表情符号为4个字符,第二个为1个字符。看起来苹果已经将4个表情符号组合成一个。

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

任何人都可以帮助我解决这个问题吗?我已经尝试了很多事情,例如正则表达式分离或componentsSeparatedByString或characterSet。但不幸的是最终以负数告终。

提前致谢。


阅读 248

收藏
2020-07-07

共1个答案

一尘不染

Swift 4(Xcode 9)更新

从Swift 4开始(通过Xcode 9 beta测试),“ Emoji ZWJ序列” Character按照Unicode 9标准的要求被视为一个:

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

但是在其他情况下,这是行不通的,例如“标志”是“区域指示器字符”的序列(比较计数元素emoji时,SwiftcountElements()返回不正确的值)。用

let str = "🇩🇪"

上面循环的结果是

["🇩", "🇪"]

这不是理想的结果。

完整规则 在Unicode标准的“标准附件#29 UNICODE TEXT SEGMENTATION”的
3字素簇边界”
中定义。

2020-07-07