ΒΏCΓ³mo puedo dividir una cadena que contiene emoji en una matriz?
Quiero tomar una serie de emoji y hacer algo con los personajes individuales.
En JavaScript, "π΄ππβπ ππ".length == 13
debido a que "β"
la longitud es 1, el resto son 2. Entonces no podemos hacer
var string = "π΄ππβπ ππ";
s = string.split("");
console.log(s);
Β‘JavaScript ES6 tiene una soluciΓ³n!, para una divisiΓ³n real :
[..."π΄ππβπ ππ"] // ["π΄", "π", "π", "β", "π ", "π", "π"]
ΒΏHurra? Excepto por el hecho de que cuando ejecuta esto a travΓ©s de su transpilador, es posible que no funcione (consulte el comentario de @brainkim). Solo funciona cuando se ejecuta de forma nativa en un navegador compatible con ES6. Afortunadamente, esto abarca la mayorΓa de los navegadores (Safari, Chrome, FF), pero si buscas una alta compatibilidad con los navegadores, esta no es la soluciΓ³n para ti.
Editar: consulte la respuesta de Orlin Georgiev para obtener una soluciΓ³n adecuada en una biblioteca: https://github.com/orling/grapheme-splitter
Gracias a esta respuesta hice una funciΓ³n que toma una cadena y devuelve una matriz de 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;
};
Entonces
emojiStringToArray("π΄ππβπ ππ")
// => Array [ "π΄", "π", "π", "β", "π ", "π", "π" ]
Con la prΓ³xima Intl.Segmenter
. Puedes hacerlo:
const splitEmoji = (string) => [...new Intl.Segmenter().segment(string)].map(x => x.segment)
splitEmoji("π΄ππβπ ππ") // ['π΄', 'π', 'π', 'β', 'π ', 'π', 'π']
Esto tambiΓ©n resuelve el problema con "π¨βπ¨βπ§βπ§" y "π¦πΎ".
splitEmoji("π¨βπ¨βπ§βπ§π¦πΎ") // ['π¨βπ¨βπ§βπ§', 'π¦πΎ']
SegΓΊn CanIUse , aparte de IE y Firefox, esto es compatible con el 91,23% de los usuarios a nivel mundial, al momento de escribir este artΓculo.
Hasta que Firefox obtenga soporte, como se menciona en la respuesta de Matt Davies , Graphemer es la mejor soluciΓ³n:
let Graphemer = await import("https://cdn.jsdelivr.net/npm/[email protected]/+esm").then(m => m.default.default);
let splitter = new Graphemer();
let graphemes = splitter.splitGraphemes("π¨βπ¨βπ§βπ§π¦πΎ"); // ['π¨βπ¨βπ§βπ§', 'π¦πΎ']