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

时间:2018-07-05 08:46:30

标签: java utf-16

我有一个像这样的字符串abc,我想将其拆分为单个字符/字符串。

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

3 个答案:

答案 0 :(得分:5)

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

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

将输出

a

b

c

答案 1 :(得分:5)

以下将完成工作:

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

答案 2 :(得分:0)

有一个开放源代码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

此处是指向该文章的链接,该文章解释了MgntUtils库及其获取位置(包括javadoc和源代码):Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison。查找段落“ 字符串Unicode转换器