How can I split a string containing emoji into an array?
The grapheme-splitter library that does just that, is fully compatible even with old browsers and works not just with emoji but all sorts of exotic characters: https://github.com/orling/grapheme-splitter You are likely to miss edge-cases in any home-brew solution. This one is actually based on the UAX-29 Unicode standart
JavaScript ES6 has a solution!, for a real split:
[..."ð´ðð⛔ð ðð"] // ["ð´", "ð", "ð", "⛔", "ð ", "ð", "ð"]
Yay? Except for the fact that when you run this through your transpiler, it might not work (see @brainkim's comment). It only works when natively run on an ES6-compliant browser. Luckily this encompasses most browsers (Safari, Chrome, FF), but if you're looking for high browser compatibility this is not the solution for you.
Edit: see Orlin Georgiev's answer for a proper solution in a library: https://github.com/orling/grapheme-splitter
Thanks to this answer I made a function that takes a string and returns an array of 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;
};
So
emojiStringToArray("ð´ðð⛔ð ðð")
// => Array [ "ð´", "ð", "ð", "⛔", "ð ", "ð", "ð" ]
The modern / proper way to split a UTF8 string is using Array.from(str)
instead of str.split('')