Как обнаружить и удалить символ эмодзи в юникодной последовательности из inputConnection?

Допустим, у меня есть поле edittext, и я должен реализовать на нем функциональность "backspace".

Удалять простой символ буквы хорошо, это работает:

Character.isLetter(inputConnection.getTextBeforeCursor(1, 0).toString()) {
   inputConnection.deleteSurroundingText(1, 0);
}

Проблема возникает, когда персонаж является символом смайликов.

Его длина выражается как 2 utf-16 символов, например:


Ухмыляющееся лицо:

Код Unicode: U+1F600

Java escape: \ud83d\ude00


В таком случае я бы просто удалил 2 символа.

Тем не менее, существуют случаи, когда эмодзи формируется из нескольких кодовых точек, например:


Радужный флаг: ️‍

Последовательность кодов Unicode: U+1F3F3 U+FE0F U+200D U+1F308

Java escape: \ud83c\udff3\ufe0f\u200d\ud83c\udf08


Когда я нажимаю клавишу Backspace, удаляется только один java-экранированный символ, а не целые эмодзи. Например, только флаг \udf08 последняя часть будет удалена, предоставляя пользователю испорченный символ эмодзи. Проверка суррогатных пар не вытащила меня из дыры, я бы все равно облажался с эмодзи.

Как я могу правильно определить правильное количество символов для удаления, чтобы я удалял 1 целый эмодзи при нажатии на клавишу возврата? (для примера флага мне нужно получить номер 6, чтобы полностью удалить его)

0 ответов

Другие вопросы по тегам