kotlin 使用代码点将 utf 字符串拆分为单个长度的子字符串

kotlin split utf string into single length sub strings using codepoint

我刚开始使用 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:こ, ん, に, ち, は, 皆, さ, ん, 

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

谢谢 史蒂夫·S.

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

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(", ")}")
}

输出:

Test string: こんにちは皆さん

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

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

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

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

另请参阅: