将 UTF-16 字符串拆分为单个 chars/strings

Split UTF-16 String into single chars/strings

我有一个看起来像这样的字符串 abc,我想将它拆分为单个 chars/strings。

static List<String> split(String text ) {
    List<String> list = new ArrayList<>(text.length());
    for(int i = 0; i < text.length() ; i++) {
        list.add(text.substring(i, i + 1));
    }
    return list;
}

public static void main(String... args) {
    split("a\uD83D\uDC4Fb\uD83D\uDE42c")
            .forEach(System.out::println);
}

正如您可能已经注意到的那样,我得到了两个奇怪的字符:

a
?
?
b
?
?
c

根据 Character and String APIs docs,您需要使用代码点来正确处理 UTF 多字节序列。

"abc".codePoints().mapToObj(Character::toChars).forEach(System.out::println);

会输出

a

b

c

以下将完成这项工作:

List<String> split(String text) {
    return text.codePoints()
            .mapToObj(Character::toChars)
            .map(String::valueOf)
            .collect(Collectors.toList());
}

有一个开源 MgntUtils 库(由我编写),它有一个实用程序,可以将任何字符串转换为 unicode,反之亦然(正确处理代码点),这可以帮助您处理问题并理解科学背后正在进行的内部工作。这是一个例子:

下面的代码

String result = "abc";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

会产生以下结果:

\u0061\u1f44f\u0062\u1f642\u0063
abc

link 这篇文章解释了 MgntUtils 库以及从哪里获取它(包括 javadoc 和源代码):Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison。查找段落“String Unicode converter