Swift 4 (Xcode 9) 更新
从 Swift 4(使用 Xcode 9 beta 测试)开始,“Emoji 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 枚举字符串
options 正确组合了这些字符:
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 标准。