【发布时间】: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