我正在使用自定义键盘,我正在使用deleteSurroundingText
删除字符。我只有两个问题。 deleteSurroundingText
在删除表情符号时效果不佳。我需要按两次del
按钮才能摆脱单个表情符号。第二个del
密钥不适用于select all
选项。
case Keyboard.KEYCODE_DELETE:
getCurrentInputConnection().deleteSurroundingText(1,0);
break;
这是当我按下尝试del表情符号时表情符号会发生的事情:?
它变成了一个问号。此外,当我尝试通过做select all
del文本没有任何反应。
任何帮助,将不胜感激
Java使用16位字符(请参阅文档中的note)。因此,一个字符可以存储从U+0000
到U+FFFF
的codepoint。
现代unicode定义了从U+0000
到U+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()方法。