HarmonyOS TextInput用系统键盘输入Emoji表情后,自定义键盘无法彻底删除该Emoji表情?

1、点击输入框,再点击打开系统键盘,输入一个Emoji表情后关闭系统键盘

2、点击输入框,唤起自定义键盘,点击 x 删除按钮,将Emoji表情删除(表面上删除,实际上会留一个特殊字符),然后点击任意数字,均无法输入。

问题:

上述场景,在自定义键盘如何真正彻底删除Emoji表情?实际上Emoji表情占两个字符长度,自定义键盘实际只删了一个字符,HarmonyOS上开发者如何知道即将删除的是个Emoji表情?

同样的场景在其他系统上,输完Emoji表情,在自定义键盘点击 x 删除按钮,删除一个字符,输入框会展示一个特殊字符,再次点击 x 删除按钮,即可将此特殊字符删除,从而删除这个Emoji表情,自定义键盘也能再次正常输入。而在HarmonyOS上则不然。

阅读 483
1 个回答

需要做一下判断,判断删除的是否为表情包,代码如下:

public onClickedKey(key: string): void {
  // 改动点:键盘按钮点击逻辑
  let offset = this.caretOffset;
  if (key == 'x') { //删除
  if (this.inputValue.length <= 0) return;
  let currentValue = this.inputValue;
  const c = currentValue.charAt(currentValue.length-2);
  //单个emoji的组合就是高位+低位,所以对于辅助平面内的代理对,做到整个移除或保留即可
  //如果字符串的最后一个是表情包,则包含两个字符(高位+低位置)
  //如果判断倒数第二个字符满足码位范围['\uD800','\uDBFF'],满足则为emoji,则需要特殊截取,同时剔除掉最后两个字符,才能将最后一个emoji表情包删除
  if (c >= '\uD800' && c <= '\uDBFF') {
  console.info("yes:"+c)
  let head = currentValue.substring(0, offset - 2)
  let tail = currentValue.substring(offset)

  this.setInputValue(head + tail)
  this.caretOffset = offset - 1
  //如果判断倒数第二个字符不满足条件,则最后一个是非emoji表情包的普通字符,正常截取,剔除掉最后一个字符,即可
}else {
  let head = currentValue.substring(0, offset - 1)
  let tail = currentValue.substring(offset)

  this.setInputValue(head + tail)
  this.caretOffset = offset - 1
}

} else { //插入
  let currentValue = this.inputValue;
  let head = currentValue.substring(0, offset)
  let tail = currentValue.substring(offset)

  this.setInputValue(head + key + tail)
  this.caretOffset = offset + key.length
}
}

Emoji表情的编码范围是固定,测试了[’\uD800’,’\uDBFF’]包含了系统键盘中所有的emoji

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进