【问题标题】:How to count grapheme clusters or "perceived" emoji characters in Java如何在 Java 中计算字素簇或“感知”的表情符号字符
【发布时间】:2016-11-30 01:34:16
【问题描述】:

我正在计算提供的 Java 字符串中感知到的表情符号字符的数量。我目前正在使用emoji4j 库,但它不适用于像这样的字素簇:??????‍????‍??????‍????

调用EmojiUtil.getLength("????‍????‍????‍????")返回4而不是1,同样调用EmojiUtil.getLength("????????‍????‍????‍????")返回5而不是2

在 Java 中 String 上是否有任何 API 或方法可以轻松计算字素簇?

我一直在寻找,但可以理解的是,String 上的 codePoints() 方法不仅包括可见的表情符号,还包括零宽度连接符。

我也尝试过使用BreakIterator

public static int getLength(String emoji) {
    BreakIterator it = BreakIterator.getCharacterInstance();
    it.setText(emoji);
    int emojiCount = 0;
    while (it.next() != BreakIterator.DONE) {
        emojiCount++;
    }
    return emojiCount;
}

但它的行为似乎与codePoints() 方法相同,返回8 类似"????????‍????‍????‍????"

【问题讨论】:

  • 有趣的话题。我试图找出这是什么类型的字符(您的第一个示例),我想知道这些组合表情符号的组合是否是供应商采用的真正的 unicode 标准或约定。您的第一个示例是女人、女人、男孩、男孩的 unicode 字符与零宽度连接符的组合。 emojipedia.org/emoji/…
  • 将字符组合成表情符号的一种方法是使用零宽度连接代码点 (ZWJ/ U+200D)。因此,获取可见字符数的一种方法是遍历所有 unicode 代码点,并且每当遇到 ZWJ 时,减去两个(对于 ZWJ 和合并到前一个字符中的下一个字符)。然而,还有更多的方式来组成 emojis(和 unicode 字符),所以你最好的选择是等待 emoji4j 更新或自己做。
  • 看起来 Java 不支持计算 Grapheme Clusters(感知字符)。所以上面的问题/答案应该仍然有效。
  • 有点不同 - 这个问题(以及上面的一些 cmets)是避免使用任何更高级别的函数或第三方位,如 ICU 库。 (他们想从int[] 到表情符号计数。)我只是在使用字符串,很乐意使用任何可用的资源。在初步测试中,ICU 库似乎可以工作 - 我会确保然后添加答案。

标签: java character emoji grapheme


【解决方案1】:

我最终使用了ICU library,效果更好。我的原始代码块不需要任何更改(除了 import 语句),因为它只是提供了 BreakIterator 的不同实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多