2014-07-02 18 views
8

(Avrete bisogno di Firefox o Safari per vedere l'emoji nel codice.)Come posso dividere una stringa contenente emoji in una matrice?

voglio prendere una serie di emoji e fare qualcosa con i singoli caratteri.

In JavaScript "⛔".length == 13 perché "⛔" lunghezza è 1, il resto sono 2. Quindi non possiamo fare

s = string.split(""); 
c = []; 
c[0] = s[0]+s[1]; 

Ecco quello che ho fatto: emoji poster

+1

http://mathiasbynens.be/notes/javascript-unicode#iterating-over-symbols –

risposta

15

Edit: vedi Orlin Georgiev's answer per una soluzione adeguata in una biblioteca: https://github.com/orling/grapheme-splitter


Grazie a this answer ho fatto una funzione che prende una stringa e restituisce un array di emoji:

var emojiStringToArray = function (str) { 
    split = str.split(/([\uD800-\uDBFF][\uDC00-\uDFFF])/); 
    arr = []; 
    for (var i=0; i<split.length; i++) { 
    char = split[i] 
    if (char !== "") { 
     arr.push(char); 
    } 
    } 
    return arr; 
}; 

Così

emojiStringToArray("⛔") 
// => Array [ "", "", "", "⛔", "", "", "" ] 
+3

notare che questo non funzionerà per emoji che utilizzano Nuovi lunghezza zero , selettori di variazione o l'emoji keycap che sono digit + keycap + selettore di varianti – Beau

+0

Basta usare il metodo 'match'' str.match (/ ([\ uD800- \ uDBFF] [\ uDC00- \ uFFFF]] /); ' e tornerà l'emoji –

+0

ho provato si lavora e funziona per me, ma guardare a questo: emojiStringToArray ("⛔❤️❤️❤️❤️❤️❤️") // => Array ["", "", "", "⛔", "", "", "", "❤️❤️❤️❤️❤️❤️"] Sai come risolvere questo ror? –

4

JavaScript ES6 ha una soluzione !, per una vera e propria spaccatura:

[..."⛔"] // ["", "", "", "⛔", "", "", ""] 

Yay? Tranne il fatto che quando esegui questo attraverso il tuo transpiler, potrebbe non funzionare (vedi il commento di @ brainkim). Funziona solo quando è eseguito nativamente su un browser compatibile ES6. Fortunatamente questo comprende la maggior parte dei browser (Safari, Chrome, FF), ma se stai cercando un'alta compatibilità con i browser, questa non è la soluzione adatta a te.

+1

Babel con le impostazioni es6 la trasporrà in una chiamata alla funzione iteratore di String in modo che funzioni in alcuni transpilers. – brainkim

+0

@brainkim L'ho specificato nella risposta. È colpa del traspiatore per non aver rispettato lo standard su questo – Downgoat

+0

Ah, sto dicendo che a volte funziona. "quando si esegue questo attraverso il transpiler, non funzionerà" implica che non funziona mai. Dipende da cosa sono gli emoji specifici nella stringa, il transpiler che stai usando, ecc. – brainkim

3

La biblioteca grafema-splitter che fa proprio questo, è pienamente compatibile anche con i vecchi browser e non funziona solo con emoji, ma tutti i tipi di caratteri esotici: https://github.com/orling/grapheme-splitter Si rischia di perdere edge-casi in ogni casa-brew soluzione. Questo è in realtà basato sul standart UAX-29 Unicode

+0

Questo è fantastico! – Clay

Problemi correlati