【问题标题】:Map String with Emojis to Array<String|Char>将带有表情符号的字符串映射到 Array<String|Char>
【发布时间】:2020-11-20 05:07:55
【问题描述】:

我想将我的字符串转换为数组或字符串列表或字符,例如:Array&lt;String&gt;Array&lt;Char&gt;

例子:

val myText = "Ab????+????2????????#✅'????ü????????{" // Parse and print to Log

应该:

[ "A", "b", "????", "+", "????", "2", "????????", "#", "✅", "'", "????", "ü", "????????", "{" ] // Array contains Strings or Chars

Java/Kotlin 方法由于 Android 上的 Emojis 而不起作用:

myText.toList() // ❌ Fails because of Emojis
myText.toMutableList() // ❌ Fails because of Emojis

【问题讨论】:

    标签: java android arrays string kotlin


    【解决方案1】:

    在 Kotlin 中,如果面向 JDK 8 或更高版本,您可以使用:

    fun String.splitToCodePoints(): List<String> {
        return codePoints()
            .toList()
            .map { String(Character.toChars(it)) }
    }
    

    如果使用JDK 7,则更手动:

    fun String.splitToCodePoints(): List<String> {
        val list = mutableListOf<String>()
        var count = 0
        while (count < length) {
            with (codePointAt(count)){
                list.add(String(Character.toChars(this)))
                count += Character.charCount(this)
            }
        }
        return list
    }
    

    在这些领域似乎缺少 Kotlin 标准库,因为您必须依赖 JDK 装箱的原始类将代码点整数转换为字符串。

    正如此处另一个答案中所述,如果您需要处理零宽度连接器,则必须更多地参与其中。您可能需要删除任何零宽度连接符,以便可以单独显示字符,或者您可能希望将它们一起显示,因此需要操作列表以组合由连接符分隔的元素。如果语言使用连字,这将影响此决定。

    【讨论】:

    • 您想要正确处理表情符号的方法是处理grapheme clusters(请注意,这不仅是表情符号问题,甚至字母也可能由组合字符组成)。从 Java 9 开始,您可以使用 Arrays.asList(myText.split("\\b{g}"))Pattern.compile("\\X").matcher(myText).results().map(MatchResult::group) .collect(Collectors.toList())
    【解决方案2】:

    在 Java 中,您可以获取字符串的码点流,并将它们中的每一个转换回字符串:

    var myText = "Ab?+?2??#✅'?ü??{";
    String[] array = myText.codePoints()
        .boxed()
        .map(i -> new String(Character.toChars(i)))
        .toArray(String[]::new)
    

    返回:

    { “A”、“b”、“?”、“+”、“?”、“2”、“?”、“?”、“#”、“✅”、“'”、“? ", "ü", "?", "?", "{" }

    请注意,some emojis 与标志或肤色和性别变化一样,是由 joining multiple Unicode code points 组成的,因此这可能会也可能不会产生您想要的结果。

    【讨论】:

    • 谢谢你的回答很好,但它需要 API 级别 24 我的版本是 21
    猜你喜欢
    • 2020-03-13
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多