Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过仅将表情符号计数为一个字符来获取字符串中字符的正确索引_Java_Android_Emoji - Fatal编程技术网

Java 通过仅将表情符号计数为一个字符来获取字符串中字符的正确索引

Java 通过仅将表情符号计数为一个字符来获取字符串中字符的正确索引,java,android,emoji,Java,Android,Emoji,我的android应用程序的问题是,当我计算包含表情符号的字符串的长度时,每个表情符号都算作两个或两个以上的字符。我正在开发一款android版本的应用程序,它有一个iOS版本。iOS将每个表情符号统计为一个字符-当从iOS应用程序返回索引时,它将假定每个表情符号都统计为一个字符 “嗨,我爱我想我应该发布我的答案,因为我有两张赞成票 决定最好将iOS索引设置为“真”,android的索引设置为“假”,这导致我不得不将所有内容都转换为iOS索引。graphemeGetIndex从Java的“假”索

我的android应用程序的问题是,当我计算包含表情符号的字符串的长度时,每个表情符号都算作两个或两个以上的字符。我正在开发一款android版本的应用程序,它有一个iOS版本。iOS将每个表情符号统计为一个字符-当从iOS应用程序返回索引时,它将假定每个表情符号都统计为一个字符


“嗨,我爱我想我应该发布我的答案,因为我有两张赞成票

决定最好将iOS索引设置为“真”,android的索引设置为“假”,这导致我不得不将所有内容都转换为iOS索引。graphemeGetIndex从Java的“假”索引中获取iOS的“真”索引,grahemeGetLength获取“真”长度,以备需要

如果你有任何问题,就问我

public static int graphemeLength(String s) {
        BreakIterator it = BreakIterator.getCharacterInstance();
        it.setText(s);
        int count = 0;
        while (it.next() != BreakIterator.DONE) {
            count++;
        }
        return count;
    }

public static int graphemeGetIndex(String wholeString, int mIndex) {
    BreakIterator it = BreakIterator.getCharacterInstance();
    int realStartIndex = 0;
    if (mIndex >= 0) {
        String partString = wholeString.substring(0, mIndex);
        it.setText(partString);
        while (it.next() != BreakIterator.DONE) {
            realStartIndex++;
        }
    }
    return realStartIndex;
}

private void recalculateIndices() {
        for (final UserMention mention : mMentions) {
            final int startFake = mCurrentText.indexOf("@" + mention.getName());
            final int startReal = graphemeGetIndex(mCurrentText, startFake);
            mention.setRealIndices(new int[]{startReal, startReal + graphemeLength(mention.getName())});
            mention.setJavaFakeIndices(new int[]{startFake, startFake + mention.getName().length()});
        }
    }

这个答案建议对代码点使用java的Unicode支持

表情符号(grapheme)是一个Unicode代码点。Java内部也使用Unicode,但通常作为(UTF-16)
char
两字节代码,表情符号的代码点的Unicode数字要高得多。因此Java使用几个字符。首先是

但是可以使用java中的代码点。Java8有一些额外的帮助;不需要,但我希望Android已经具备了一些功能

以代码点为单位计算长度:

查找按代码点索引的字符串位置:

int-codePointIndexOf(字符串s,int-codePoint){
int n=0;
对于(int i=0;icp!=codePoint).count();
返回计数>=总计数?-1:计数;
}

在看到新的表情符号发布后,我的答案是使用一个维护良好的库:

我导入了此库:

implementation 'com.vdurmont:emoji-java:4.0.0'
然后,我创建了一个实用方法,将字符串的长度计算为1:

fun getLengthWithEmoji(s: String): Int{
        var emojiCount = EmojiParser.extractEmojis(s).size;
        var noEmojiString = EmojiParser.removeAllEmojis(s);
        var emojiAndStringCount = emojiCount + noEmojiString.length;
        return emojiAndStringCount;
}
通常,要“获取字符串中的表情符号计数”,我会使用以下行:

var emojiCount = EmojiParser.extractEmojis(s).size;

这说明了所有最新的表情符号(取决于您的库的最新程度)。检查其他人在库上制作的一些叉子,因为它们在某些情况下添加了缺失的表情符号模式。

neat!我在下面发布了我的解决方案,以防您感兴趣。
implementation 'com.vdurmont:emoji-java:4.0.0'
fun getLengthWithEmoji(s: String): Int{
        var emojiCount = EmojiParser.extractEmojis(s).size;
        var noEmojiString = EmojiParser.removeAllEmojis(s);
        var emojiAndStringCount = emojiCount + noEmojiString.length;
        return emojiAndStringCount;
}
var emojiCount = EmojiParser.extractEmojis(s).size;