Java 尝试从包含多个单词的字符串中获取第一个字符,其中第一个字符可以是表情符号(Android)

Java 尝试从包含多个单词的字符串中获取第一个字符,其中第一个字符可以是表情符号(Android),java,android,string,substring,Java,Android,String,Substring,我需要获取字符串的第一个字符,目前我使用的是: String firstCharacter = getTitle().substring(0, 1); 其中getTitle()返回可以包含多个单词和表情符号的字符串,如果第一个字符是表情符号,并且我使用substring当我显示firstCharacter而不是表情符号时,我会得到一个问号,因为使用substring我会剪切表情符号 我想做的是: 如果第一个单词是表情符号,则在不使用子字符串的情况下检索并将其分配给firstCharacter

我需要获取字符串的第一个字符,目前我使用的是:

String firstCharacter = getTitle().substring(0, 1);
其中
getTitle()
返回可以包含多个单词和表情符号的
字符串,如果第一个字符是表情符号,并且我使用
substring
当我显示firstCharacter而不是表情符号时,我会得到一个问号,因为使用
substring
我会剪切表情符号

我想做的是:

  • 如果第一个单词是表情符号,则在不使用子字符串的情况下检索并将其分配给
    firstCharacter

  • 如果第一个单词是实际单词,请使用
    子字符串
    ,就像我目前正在做的那样

我该怎么做呢?

Android现在支持带有EmojiCompat的Emojis 用于支持Android中的表情符号。您可以通过下载或在应用程序中打包来初始化它


// Initialize with your desired config 
EmojiCompat.init(BundledEmojiCompatConfig(context))

// Check if EmojiCompat was successfully loaded
if (EmojiCompat.get().loadState == EmojiCompat.LOAD_STATE_SUCCEEDED) {
    EmojiCompat.get().hasEmojiGlyph(yourString)
}


旧答案: 可以找到表情符号范围

因此,这将导致(未测试):


只需使用
String.codePointAt()

新字符串(Character.toChars(getTitle().codePointAt(0)))

您是否尝试过使用正则表达式检查第一个字符是字母a-z还是a-z,如果表情符号不是简单的,这会给您带来麻烦。例如,对于包含修饰符(肤色)/变体选择器(在文本/表情呈现之间切换)/zwj序列(族)/标志的表情符号&例如(如果不实际分析代码点,就无法预测表情符号的长度)-请参阅以供参考。@mrlem您是对的。安卓系统现在有了,我更新了我的答案。:)@yennsarah事实上这让我们的生活更轻松。。。除了最初的问题是获得第一个字符(无论它是否是表情符号)。就我所知,EmojiCompat相当麻烦:它允许您处理字符串a,因此将emojis替换为emojispans,但这并不能直接解决问题您也可以使用BreakIterator.getCharacterInstance(),但是,如果您使用java.text版本的类,它在unicode支持方面有各种缺点,如果您使用icu版本,它有兼容性问题--相当混乱!
if(getTitle().substring(0,5)
    == ("/[\u2190-\u21FF] | [\u2600-\u26FF] | [\u2700-\u27BF] | 
          [\u3000-\u303F] | [\u1F300-\u1F64F] | [\u1F680-\u1F6FF]/g")){
    firstCharacter = getTitle().substring(0,5);
} else{
    firstCharacter = getTitle().substring(0,1);
}