2015-12-30 14 views
6

Tôi đã nhập hai biểu tượng cảm xúc vào trường văn bản ‍‍‍, ở đây tôi nhận được tổng số có độ dài là 5 ký tự trong khi 4 ký tự cho biểu tượng cảm xúc đầu tiên và 1 ký tự cho giây. Có vẻ như quả táo đã kết hợp 4 biểu tượng cảm xúc để tạo thành một biểu tượng cảm xúc.Cách nhập biểu tượng cảm xúc được nhập (thông qua bàn phím mặc định) trên trường văn bản

Tôi đang tìm mã swift nơi tôi có thể tách riêng từng biểu tượng cảm xúc, giả sử bằng cách lấy ví dụ trên, tôi sẽ nhận được 2 chuỗi/ký tự riêng cho mỗi biểu tượng cảm xúc.

Bất kỳ ai có thể giúp tôi giải quyết vấn đề này, tôi đã thử nhiều thứ như tách regex hoặc componentsSeparatedByString hoặc characterSet. nhưng tiếc là kết thúc với tiêu cực.

Xin cảm ơn trước.

Trả lời

3

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 .

+0

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

+0

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. –

+1

@KiranJasvanee: "Sự cố" đã được khắc phục trong Swift 4 (hiện tại là phiên bản beta). –

1

Bạn có thể sử dụng mã này example hoặc điều này pod.

Để sử dụng nó trong Swift, nhập khẩu các loại vào YourProject_Bridging_Header

#import "NSString+EMOEmoji.h" 

Sau đó, bạn có thể kiểm tra phạm vi cho mỗi biểu tượng cảm xúc trong chuỗi của bạn:

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: ["‍‍‍", ""] 

I created an small example project with the code above.

Để biết thêm đọc, bài viết thú vị này từ Instagram.

Các vấn đề liên quan