You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android下含Emoji的String转Array<String|Char>方案需求

解决Android中带Emoji字符串的正确拆分问题

我完全懂你踩的这个坑!很多Emoji(尤其是带肤色修饰、组合类型的)本质是由多个Unicode代码点拼接而成的,而Kotlin/Java原生的toList()这类方法是按UTF-16的单个代码单元拆分的,自然会把一个完整的Emoji拆成好几段,完全不符合预期。

下面给你两种靠谱的实现方式,都能正确把字符串拆成包含完整Emoji的List<String>:

方法一:直接遍历Unicode代码点(纯Kotlin,无需Android依赖)

这种方法直接操作字符串的Unicode代码点,每个完整的字符(包括多代码点的Emoji)都会被当作一个单元处理:

fun String.toGraphemeList(): List<String> {
    val graphemes = mutableListOf<String>()
    var currentIndex = 0
    while (currentIndex < this.length) {
        // 获取当前位置的Unicode代码点
        val codePoint = this.codePointAt(currentIndex)
        // 计算这个代码点需要多少个Char来表示(1或2)
        val charCount = Character.charCount(codePoint)
        // 截取对应长度的子串,加入结果列表
        graphemes.add(this.substring(currentIndex, currentIndex + charCount))
        // 移动索引到下一个字符的起始位置
        currentIndex += charCount
    }
    return graphemes
}

测试你给的示例:

val myText = "Ab😟+魯2👨🏽#✅'👨ü👨🏿{"
val splitResult = myText.toGraphemeList()
println(splitResult)
// 输出正好是你想要的:["A", "b", "😟", "+", "魯", "2", "👨🏽", "#", "✅", "'", "👨", "ü", "👨🏿", "{"]

方法二:用Android系统的BreakIterator(推荐在Android项目中使用)

Android提供的BreakIterator专门用来处理文本拆分,它会严格按照Unicode标准的**字符集群(Grapheme Cluster)**来拆分,对于复杂文本的处理更稳妥:

import android.text.BreakIterator

fun String.toGraphemeList(): List<String> {
    val graphemeIterator = BreakIterator.getCharacterInstance()
    graphemeIterator.setText(this)
    val result = mutableListOf<String>()
    
    var startIndex = graphemeIterator.first()
    var endIndex = graphemeIterator.next()
    while (endIndex != BreakIterator.DONE) {
        result.add(this.substring(startIndex, endIndex))
        startIndex = endIndex
        endIndex = graphemeIterator.next()
    }
    return result
}

这个方法的效果和第一种完全一致,而且是Android官方推荐的文本拆分方式,适合在Android应用中使用。

为什么原生方法会失效?

简单说:

  • Kotlin的Char对应UTF-16的单个代码单元,而很多Emoji(比如👨🏽)需要两个UTF-16代码单元才能表示
  • 原生的toList()会把每个代码单元拆成一个Char,所以👨🏽会被拆成👨和🏽两个独立元素,这就导致了结果错误

内容的提问来源于stack exchange,提问作者A. Amini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:58:00