0

我刚刚开始使用 kotlin,所以我确信有一种简单的方法可以做到这一点,但我没有看到。我想使用代码点将 a 拆分为单长度子字符串。在 Java 8 中,这有效:

public class UtfSplit {
    static String [] utf8Split (String str) {
        int [] codepoints = str.codePoints().toArray();
        String [] rv = new String[codepoints.length];
        for (int i = 0; i < codepoints.length; i++)
            rv[i] = new String(codepoints, i, 1);
        return rv;
    }
    public static void main(String [] args) {
        String test = "こんにちは皆さん";
        System.out.println("Test string:" + test);
        StringBuilder sb = new StringBuilder("Result:");
        for(String s : utf8Split(test))
            sb.append(s).append(", ");
        System.out.println(sb.toString());
    }
}

输出是:

Test string:こんにちは皆さん
Result:こ, ん, に, ち, は, 皆, さ, ん, 

我将如何在 kotlin 中做到这一点?我可以到达代码点,尽管它很笨拙,而且我确信我做错了。但我无法从代码点返回字符串。整个字符串/字符界面对我来说似乎不同,我只是不明白。

谢谢史蒂夫·S。

4

1 回答 1

1

您使用与 Java 相同的运行时,因此代码基本上在做同样的事情。然而,Kotlin 版本更短,也不需要类,尽管您可以将实用程序方法分组到一个对象中。这是使用顶级函数的版本:

fun splitByCodePoint(str: String): Array<String> {
    val codepoints = str.codePoints().toArray()
    return Array(codepoints.size) { index ->
        String(codepoints, index, 1)
    }
}

fun main(args: Array<String>) {
    val input = "こんにちは皆さん"
    val result = splitByCodePoint(input)

    println("Test string: ${input}")
    println("Result:      ${result.joinToString(", ")}")
}

输出:

测试字符串:こんにちは皆さん

结果:こ、ん、に、ち、は、皆、さ、ん</p>

注意:我重命名了该函数,因为编码并不重要,因为您只是按代码点进行拆分。

有些人可能会在没有局部变量的情况下这样写:

fun splitByCodePoint(str: String): Array<String> {
    return str.codePoints().toArray().let { codepoints ->
        Array(codepoints.size) { index -> String(codepoints, index, 1) }
    }
}

也可以看看:

于 2018-12-16T03:42:21.210 回答