Разделить строку UTF-16 на одинарные символы / строки - PullRequest
0 голосов
/ 05 июля 2018

У меня есть строка, которая выглядит следующим образом a?b?c, и я хочу разделить ее на отдельные символы / строки.

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 голосов
/ 05 июля 2018

Следующее выполнит работу:

List<String> split(String text) {
    return text.codePoints()
            .mapToObj(Character::toChars)
            .map(String::valueOf)
            .collect(Collectors.toList());
}
0 голосов
/ 05 июля 2018

Существует библиотека с открытым исходным кодом MgntUtils (написанная мной), в которой есть утилита, которая переводит любую строку в юникод и наоборот (правильно обрабатывает кодовые точки), которая может помочь вам решить вашу проблему, а также понять внутреннюю работу происходит за наукой. Вот пример:

код ниже

String result = "a?b?c";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

выдаст следующее:

\u0061\u1f44f\u0062\u1f642\u0063
a?b?c

Вот ссылка на статью, в которой рассказывается о библиотеке MgntUtils и о том, где ее взять (включая javadoc и исходный код): Библиотека Java с открытым исходным кодом с фильтрацией трассировки стека, конвертер Unicode для анализа Silent String и сравнение версий . Ищите абзац " String Unicode converter "

0 голосов
/ 05 июля 2018

В соответствии с Символьными и строковыми API-документами вам необходимо использовать кодовые точки для правильной обработки многобайтовых последовательностей UTF.

"a?b?c".codePoints().mapToObj(Character::toChars).forEach(System.out::println);

выведет

a
?
b
?
c
...