如何将包含表情符号的字符串拆分为数组?

时间:2014-07-02 12:59:56

标签: javascript unicode emoji

(您需要Firefox或Safari才能在代码中看到表情符号。)

我想带一串表情符号并对各个角色做点什么。

在JavaScript "⛔".length == 13中因为"⛔"长度为1,其余为2.所以我们无法做到

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

这是我做的: emoji poster

6 个答案:

答案 0 :(得分:19)

修改:请参阅Orlin Georgiev's answer了解库中的正确解决方案:https://github.com/orling/grapheme-splitter


感谢this answer我创建了一个函数,它接受一个字符串并返回一个表情符号数组:

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;
};

所以

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

答案 1 :(得分:9)

这样做的字素分割器库即使与旧的浏览器也完全兼容,并且不仅可以使用表情符号,还可以使用各种奇特的字符: https://github.com/orling/grapheme-splitter 您可能会错过任何家庭酿造解决方案中的边缘案例。这个实际上是基于UAX-29 Unicode标准

答案 2 :(得分:5)

JavaScript ES6有一个解决方案!,用于真正的拆分:

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

耶?除了你通过浏览器运行它的事实,它可能不起作用(参见@ brainkim的评论)。它仅在本机运行在符合ES6的浏览器上时才有效。幸运的是,这包含了大多数浏览器(Safari,Chrome,FF),但如果您正在寻找高浏览器兼容性,那么这不适合您。

答案 3 :(得分:5)

分割UTF8字符串的现代/正确方法是使用Array.from(str)而不是str.split('')

答案 4 :(得分:2)

可以使用正则表达式的yarn remove prop-types 标志来完成。正则表达式为:

u

每次至少有零个或多个字符(可能是表情符号或可能不是表情符号,但不能是空格或换行符)时,此字符将被破坏。

  • 至少有零个或多个零:/.*?/u (以零个字符分隔)
  • 零或更多:?
  • 不能为空格或换行符:*
  • 也许不是表情符号:.

通过使用问号/u,我强制将每个字符都切成零个字符,否则,?会切成所有字符,直到找到空格或换行符为止。

/.*/u

答案 5 :(得分:1)

Orlin Georgiev的Grapheme Splitter库非常棒。

尽管它已经有一段时间没有更新了,但目前(2020年9月)它仅支持Unicode 10及以下版本。

有关使用支持Unicode 13的Typescript构建的Grapheme Splitter的更新版本,请查看:https://github.com/flmnt/graphemer

以下是一个简单的示例:

import Graphemer from 'graphemer';

const splitter = new Graphemer();

const string = "???⛔???";

splitter.countGraphemes(string); // returns 7

splitter.splitGraphemes(string); // returns array of characters

该库还可以使用最新的表情符号。

例如"??‍?".length === 7,但splitter.countGraphemes("??‍?") === 1

完全公开:我创建了该库,并进行了工作以将其更新为Unicode13。该API与Grapheme Splitter完全相同,并且完全基于该工作,只是更新为Unicode的最新版本,因为原始库尚未更新已更新了两年,而且似乎已不再维护。