Как извлечь эмодзи и буквы алфавита из строки - PullRequest
0 голосов
/ 05 июля 2018

Я хочу извлечь эмодзи и символы алфавита из строки в коллекцию, просто строка имеет любой тип символа эмодзи, например, активность, семью, флаг, символы животных, а также символы алфавита. когда я получил строку из EditText, это похоже на «AB?C?D?‍?‍?‍?E?️‍?‍?». Я пытался, но, к сожалению, получение массива коллекции не похоже на мои ожидания, так что, может кто-нибудь подсказать мне, что мне нужно сделать для ожидаемого массива коллекции?

Используя Eclipse, я попытался исправить этот фрагмент кода, если я ошибаюсь

public class CodePoints {

    public static void main(String []args){
        List<String> list = new ArrayList<>();
        for(int codePoint : codePoints("AB?C?D?‍?‍?‍?E?️‍?‍?")) {
            list.add(String.valueOf(Character.toChars(codePoint)));
        }

        System.out.println(Arrays.toString(list.toArray()));
    }

    public static Iterable<Integer> codePoints(final String string) {
     return new Iterable<Integer>() {
       public Iterator<Integer> iterator() {
         return new Iterator<Integer>() {
           int nextIndex = 0;
           public boolean hasNext() {
             return nextIndex < string.length();
           }
           public Integer next() {
             int result = string.codePointAt(nextIndex);
             nextIndex += Character.charCount(result);
             return result;
           }
           public void remove() {
             throw new UnsupportedOperationException();
           }
         };
       }
     };
   }
}

Выход:
[A, B, ?, C, ?, D, ?, ‍, ?, ‍, ?, ?, ‍, E, E, ?, ️, ‍, ?, ‍, ?]

Ожидаемая:
[A, B, ?, C, ?, D, ?‍?‍?‍?, E, ?️‍?‍, ?]

1 Ответ

0 голосов
/ 02 января 2019

Проблема в том, что ваша строка содержит невидимые символы.
Это:
Символ Unicode 'ZIRO WIDTH JOINER' (U + 200D)
Unicode-символ 'VARIATION SELECTOR-16' (U + FE0F)
Другие похожие:
Unicode-символ 'SOFT HYPHEN' (U + 00AD)
...

Java-кодируется в кодировке utf16, см .: https://en.wikipedia.org/wiki/UTF-16
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs (see the section Unicode Character Representations in the Character class for more information). Index values refer to char code units, so a supplementary character uses two positions in a String.

Это метод итерации отдельных символов Юникода в строке.

public static List<String> getUnicodeCharacters(String str) {
    List<String> result = new ArrayList<>();
    char charArray[] = str.toCharArray();
    for (int i = 0; i < charArray.length; ) {
        if (Character.isHighSurrogate(charArray[i])
                && (i + 1) < charArray.length
                && Character.isLowSurrogate(charArray[i + 1])) {
            result.add(new String(new char[]{charArray[i], charArray[i + 1]}));
            i += 2;
        } else {
            result.add(new String(new char[]{charArray[i]}));
            i++;
        }
    }
    return result;
}

@Test
void getUnicodeCharacters() {
    String str = "AB?C?D?‍?‍?‍?E?️‍?‍?";
    System.out.println(str.codePointCount(0, str.length()));
    for (String unicodeCharacter : UTF_16.getUnicodeCharacters(str)) {
        if ("\u200D".equals(unicodeCharacter)
                || "\uFE0F".equals(unicodeCharacter))
            continue;
        System.out.println(unicodeCharacter);
    }
}
...