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