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

问题描述 投票:0回答:3

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

String firstCharacter = getTitle().substring(0, 1);

其中

getTitle()
返回可以包含多个单词和表情符号的
String
,如果第一个字符是表情符号,并且当我显示第一个字符而不是表情符号时使用
substring
,我会得到一个问号,因为使用
substring
我剪了表情符号。

我想做的是:

  • 如果第一个单词是表情符号,则检索并将其分配给

    firstCharacter
    ,而不使用
    substring
    ;

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

    substring

我怎样才能做到?

java android string substring
3个回答
2
投票

只需使用

String.codePointAt()

new String(Character.toChars(getTitle().codePointAt(0)))

1
投票

Android 现在通过 EmojiCompat 支持表情符号

EmojiCompat 用于支持 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)
}


旧答案:

表情符号范围可以在这里

找到

所以,这会导致(未测试):

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);
}

0
投票

Kotlin 多平台 (KMP) 版本,支持表情符号以及其他多字节字符串(例如中文)

// libs used:
implementation("de.cketti.unicode:kotlin-codepoints-deluxe:0.9.0") // Only needed for KMP
implementation("org.kodein.emoji:emoji-kt:2.1.0")
/**
 * Multibyte (e.g. Chinese, emoji) safe way to fetch the first character of a string
 */
fun String.firstCharacter(): String {
    if (this.length < 2) return this

    EmojiFinder().findEmoji(this).firstOrNull()?.let {
        if (it.start == 0) return this.substring(it.start, it.end)
    }

    return this.take(this.offsetByCodePoints(0, 1))
}
@Test
fun testFirstCharater() {
    assertEquals("", "".firstCharacter())
    assertEquals("1", "1".firstCharacter())
    assertEquals("J", "Johny".firstCharacter())
    assertEquals("\uD83D\uDE0A", "\uD83D\uDE0A Regular emoji".firstCharacter())
    assertEquals("\uD83C\uDDEB\uD83C\uDDF7", "\uD83C\uDDEB\uD83C\uDDF7 flag".firstCharacter())
    assertEquals("读", "读写".firstCharacter())
}
© www.soinside.com 2019 - 2024. All rights reserved.