为什么 deleteSurroundingText 不适用于表情符号和 select 全部?

Why deleteSurroundingText doesn't work with emojis and select all?

我正在使用自定义键盘并使用 deleteSurroundingText 删除字符。我对此只有两个问题。 deleteSurroundingText 删除表情符号时效果不佳。我需要按两次 del 按钮才能摆脱单个表情符号。第二个 del 键不适用于 select all 选项。

case Keyboard.KEYCODE_DELETE:
    getCurrentInputConnection().deleteSurroundingText(1,0);
    break;

当我按下尝试删除表情符号时,表情符号会发生以下情况: ?

变成了问号。 此外,当我尝试通过 select all 删除文本时,什么也没有发生。

如有任何帮助,我们将不胜感激

Java 使用 16 位字符(请参阅文档中的 note)。所以一个字符可以存储从 U+0000U+FFFF 的代码点。
现代 unicode 定义代码点范围从 U+0000U+10FFFF。 大多数表情符号的代码点都超过 U+FFFF。为了表示这样的代码点,使用了所谓的“surrogate pairs”。
换句话说,每个表情符号(以及 U+FFFF 边界之外的所有其他代码点)由字符串中的 两个 后续字符表示。
当您调用 deleteSurroundingText(1,0); 时,您会损坏代理对。尚未删除的代理对部分呈现为 ? 标记。

deleteSurroundingText()的文档特别强调这种情况:

IME authors: please be careful not to delete only half of a surrogate pair. Also take care not to delete more characters than are in the editor, as that may have ill effects on the application. Calling this method will cause the editor to call onUpdateSelection(int, int, int, int, int, int) on your service after the batch input is over.

请下次尝试使用前仔细阅读方法文档。

要确定字符是否是代理项对的一部分,请使用 Chracter::isSurrogate() 方法。

如果有一些选择,并且应该删除所有选择,可以使用 commitText("", 1) - 这将用空字符串替换所选文本。