2015-12-30 8 views
6

Ho inserito due emoji nel testo, qui sto ottenendo un numero totale di 5 caratteri di lunghezza mentre 4 caratteri per la prima emoji e 1 carattere per la seconda. Sembra che la mela abbia combinato 4 emoji per formare uno.Come separare gli emoji inseriti (tramite tastiera predefinita) sul campo di testo

Sto cercando il codice rapido dove posso separare separatamente ciascuna delle emoji, supponiamo che prendendo l'esempio precedente dovrei ottenere 2 stringhe/caratteri separatamente per ogni emoji.

Qualcuno può aiutarmi a risolvere questo, ho provato molte cose come la separazione regex o componentSeparatedByString o characterSet. ma sfortunatamente finì con il negativo.

Grazie in anticipo.

risposta

3

Aggiornamento per Swift 4 (Xcode 9)

Come di Swift 4 (testato con Xcode 9 beta) un "Emoji ZWJ Sequence" è trattata come un singolo Character come richiesto dallo standard Unicode 9:

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

anche String è una raccolta dei suoi caratteri (nuovo), così possiamo chiamata str.count per ottenere la lunghezza, e Array(str) ottenere tutti caratteri come un array.


(risposta vecchio per Swift 3 e precedenti)

Questa è solo una risposta parziale che può aiutare in questo caso particolare.

"" è infatti una combinazione di quattro caratteri separati:

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

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

che vengono incollati con 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 
*/ 

enumerazione la stringa con il .ByComposedCharacterSequences Le opzioni combina correttamente questi caratteri:

Ma ci sono altri casi in cui questo non funziona, ad es. le "bandiere" che sono una sequenza di "Indicatore regionale caratteri" (confronta Swift countElements() return incorrect value when count flag emoji). Con

let str = "" 

il risultato del ciclo precedente è

["", ""] 

che non è il risultato desiderato.

Le regole complete sono definiti in "3 Grapheme Cluster Boundaries" in "Standard allegato # 29 Testo Unicode segmentazione" nello standard Unicode .

+0

Ciao Martin. Prima di tutto molte grazie per la risposta. Come hai detto, ci sono casi in cui questo non funzionerà, ma ho provato il tuo codice e funziona bene. ecco la mia stringa completa con molti flag [""] che sono stati separati in ["", "", "", "", ""]. Un'altra cosa stavo cercando di risolvere questo da ieri in poi, ma non sono riuscito a farcela. Puoi dirmi come impari quelle cose e quale documentazione preferirei? – KiranJasvanee

+0

Ho anche provato questa logica con le bandiere, e ha funzionato bene per un paio di bandiere diverse. –

+1

@KiranJasvanee: Il "problema" è stato risolto in Swift 4 (attualmente beta). –

1

È possibile utilizzare questo codice example o questo pod.

di utilizzarlo in Swift, importare la categoria nella YourProject_Bridging_Header

#import "NSString+EMOEmoji.h" 

Quindi è possibile controllare l'intervallo per ogni emoji nella stringa:

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.

Per ulteriori leggendo, questo interessante articolo da Instagram.

Problemi correlati