Как обнаружить и удалить символ эмодзи в юникодной последовательности из inputConnection? - PullRequest
0 голосов
/ 17 февраля 2019

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

Удаление простого буквенного символа - это хорошо, оно работает:

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

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

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

Улыбающееся лицо: face

Код 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, чтобы полностью его удалить)

...