2015-12-30 6 views
6

Wprowadziłem dwa emotikony w polu tekstowym, tutaj otrzymuję całkowitą liczbę 5 znaków długości, podczas gdy 4 znaki dla pierwszego emoji i 1 znak dla drugiego. Wygląda na to, że jabłko połączyło 4 emoji, aby utworzyć jeden.Jak oddzielić wprowadzone emotikony (poprzez domyślną klawiaturę) na pole tekstowe

szukam kodu Swift gdzie mogę oddzielić od emotikony osobno, załóżmy, przyjmując powyższy przykład Byłbym dostaniem 2 łańcuchy/charakter odrębnie dla każdej z emotikonami.

Czy ktoś może mi pomóc rozwiązać ten problem, próbowałem wielu rzeczy, takich jak separacja regex lub componentsSeparatedByString lub characterSet. ale niestety skończyło się na minusie.

Z góry dziękuję.

Odpowiedz

3

Aktualizacja Swift 4 (Xcode 9)

Jako Swift 4 (test z Xcode 9 beta) w "Emoji ZWJ sekwencji" traktowane jako pojedynczy Character zgodnie z zaleceniami normy Unicode 9:

let str = "‍‍‍" 
print(str.count) // 2 
print(Array(str)) // ["‍‍‍", ""] 

także String jest zbiorem jego znaków (znowu), więc możemy wezwanie str.count aby uzyskać długość i Array(str) uzyskać wszystkie znaków jako tablicę.


(Old odpowiedź na Swift 3 i wcześniej)

Jest to tylko częściowa odpowiedź, która może pomóc w tym konkretnym przypadku.

"" jest w rzeczywistości połączenie z czterech oddzielnych postaci:

let str = "‍‍‍" // 
print(Array(str.characters)) 

// Output: ["‍", "‍", "‍", "", ""] 

, które są sklejone z U + 200D (zerowej szerokości JOINER)

for c in str.unicodeScalars { 
    print(String(c.value, radix: 16)) 
} 

/* Output: 
1f468 
200d 
1f468 
200d 
1f467 
200d 
1f467 
1f60d 
*/ 

Wyliczanie ciąg z .ByComposedCharacterSequences opcje poprawnie łączą te znaki:

var chars : [String] = [] 
str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) { 
    (substring, _, _, _) ->() in 
    chars.append(substring!) 
} 
print(chars) 

// Output: ["‍‍‍", ""] 

Są jednak inne przypadki, w których to nie działa, np. "flagi" będące ciągiem znaków "Regional Indicator " (porównaj Swift countElements() return incorrect value when count flag emoji). Z

let str = "" 

wynikiem wyżej pętli

["", ""] 

, który nie jest pożądany rezultat.

Pełne zasady są określone w "3 Grapheme Cluster Boundaries" w „Standard załącznik nr 29 UNICODE TEKSTU SEGMENTACJI” w standardzie Unicode.

+0

Witam Martinie. Przede wszystkim wielkie dzięki za odpowiedź. Jak już powiedziałeś, są przypadki, w których to nie zadziała, ale spróbowałem twojego kodu i działa dobrze. tutaj jest mój pełny ciąg z wieloma flagami [""], które zostały rozdzielone na ["", "", "", "", ""]. Jeszcze jedno próbowałem rozwiązać to od wczoraj, ale nie byłem w stanie tego zrobić. Czy możesz mi powiedzieć, jak się uczysz tych rzeczy i jaką dokumentację powinienem wybrać? – KiranJasvanee

+0

Próbowałem również tej logiki z flagami i działało dobrze dla kilku różnych flag. –

+1

@KiranJasvanee: "Problem" został naprawiony w Swift 4 (obecnie wersja beta). –

1

Możesz użyć tego kodu example lub tego pod.

Aby użyć go w Swift, importować kategorię do YourProject_Bridging_Header

#import "NSString+EMOEmoji.h" 

Następnie można sprawdzić zakres dla każdego emotikonami w ciąg:

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.

Dla dalszego czytanie, ten interesujący artykuł z Instagram.