Cập nhật cho Swift 4 (Xcode 9)
Tính Swift 4 (thử nghiệm với Xcode 9 beta) một "Emoji ZWJ Chuỗi" được coi là một đơn Character
như là bắt buộc theo tiêu chuẩn Unicode 9:
let str = ""
print(str.count) // 2
print(Array(str)) // ["", ""]
Cũng String
là một tập hợp các ký tự của nó (một lần nữa), vì vậy chúng ta có thể gọi str.count
để có được độ dài, và Array(str)
để có được tất cả nhân vật như một mảng.
(Cũ câu trả lời cho Swift 3 trở về trước)
Đây chỉ là một câu trả lời phần nào có thể giúp trong trường hợp đặc biệt này.
"" thực sự là một sự kết hợp của bốn nhân vật riêng biệt:
let str = "" //
print(Array(str.characters))
// Output: ["", "", "", "", ""]
được dán cùng với 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
*/
Tiến hành thống kê các chuỗi với .ByComposedCharacterSequences
Các tùy chọn kết hợp các ký tự này chính xác:
var chars : [String] = []
str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) {
(substring, _, _, _) ->() in
chars.append(substring!)
}
print(chars)
// Output: ["", ""]
Nhưng có những trường hợp khác, điều này không hoạt động, ví dụ: "cờ" là một chuỗi "Chỉ số khu vực ký tự" (so sánh Swift countElements() return incorrect value when count flag emoji). Với
let str = ""
kết quả của vòng lặp trên là
["", ""]
mà không phải là kết quả mong muốn.
Quy tắc đầy đủ được xác định trong "3 Grapheme Cluster Boundaries" trong "Phụ lục chuẩn # 29 UNICODE TEXT SEGMENTATION" trong tiêu chuẩn Unicode .
Xin chào Martin. Trước hết, xin cám ơn câu trả lời. Như bạn đã nói rằng có những trường hợp điều này sẽ không hoạt động, nhưng tôi đã thử mã của bạn và nó hoạt động tốt. đây là chuỗi đầy đủ của tôi với nhiều cờ [""] đã được tách thành ["", "", "", "", ""]. Một điều nữa tôi đã cố gắng giải quyết điều này từ ngày hôm qua trở đi nhưng không thể làm được. Bạn có thể vui lòng cho tôi biết cách bạn học những điều đó và tài liệu nào tôi nên thích? – KiranJasvanee
Tôi cũng đã thử logic này với cờ, và nó làm việc tốt cho một vài lá cờ khác nhau. –
@KiranJasvanee: "Sự cố" đã được khắc phục trong Swift 4 (hiện tại là phiên bản beta). –