Eclipse IDE обрабатывает эмодзи с использованием суррогатных пар

Я не могу найти четкого ответа на это. Поддерживает ли ECLIPSE IDE эмодзи? Я много читал о суррогатных парах здесь о переполнении стека, но я не могу получить четкого ответа на этот вопрос.

Мне нужно читать текстовый файл посимвольно, и я использую FileInputStream.

Можно ли обрабатывать смайлики с помощью суррогатных пар? Я хочу использовать несколько избранных яблочных смайликов. В частности, это: ???? ???? ???????? Обрабатывая их, я имею в виду, что я хотел бы идентифицировать их как этот конкретный смайлик при чтении файла.

Если да, может ли кто-нибудь показать мне пример?


person Wanda    schedule 01.11.2016    source источник
comment
Краткий ответ: Да, это возможно. Что означает «обработать смайлики»? Что вы хотите с ними сделать?   -  person VGR    schedule 01.11.2016
comment
Обрабатывая их, я имею в виду, что я хотел бы иметь возможность идентифицировать их по отдельности и возвращать что-то в зависимости от того, какой это смайлик.   -  person Wanda    schedule 01.11.2016


Ответы (1)


InputStreams предназначены для чтения байтов; Reader предназначены для чтения символов. Таким образом, вы должны использовать Reader, полученный из Files.newBufferedReader, или использовать FileReader или InputStreamReader.

Хотя Java использует суррогатные пары внутри String для представления эмодзи и многих других типов символов Unicode, вам не нужно иметь дело с суррогатными парами напрямую. Суррогатные значения существуют только потому, что многие символьные значения слишком велики для типа Java char. Если вы читаете отдельные символы как значения int (например, с CharSequence.codePoints), вы каждый раз будете получать целые значения символов, и вам никогда не придется иметь дело с суррогатным значением.

На момент написания этой статьи эмодзи определяются Unicode как блоки смайликов. , часть блока Дополнительные символы и пиктограммы, и три устаревших символа в блоке Блок Разные символы.

Таким образом, использование BufferedReader и обход символьных данных с целыми числами может выглядеть так:

try (BufferedReader reader =
    Files.newBufferedReader(Paths.get(filename), Charset.defaultCharset())) {

    IntStream chars = reader.lines().flatMapToInt(String::codePoints);
    chars.forEachOrdered(c -> {
        if ((c >= 0x2639 && c <= 0x263b) ||
            (c >= 0x1f600 && c < 0x1f650) ||
            (c >= 0x1f910 && c < 0x1f930)) {

            processEmoji(c);
        }
    });
}
person VGR    schedule 01.11.2016
comment
Большое спасибо, это очень помогло. Я ценю ваш подробный ответ. У меня было ощущение, что я не использовал правильный ридер файлов. - person Wanda; 02.11.2016