通过 unicode 在文本字段中显示具有肤色变化的表情符号

Posted

技术标签:

【中文标题】通过 unicode 在文本字段中显示具有肤色变化的表情符号【英文标题】:Display emojis with skin color variation in a textfield via unicode 【发布时间】:2020-07-14 12:08:49 【问题描述】:

我目前正在尝试通过 unicode 在文本视图中显示表情符号。 我知道更改\U0001f4ea -> 0x1f4ea 然后调用textView.setText(new String(Character.toChars(0x1f4ea))); 在文本视图中显示表情符号。然而,大多数包含面孔的现代表情符号在后面都有一个额外的 unicode 字符,例如 \U0001f1fa\U0001f1ff 用于颜色变体。

我不确定如何将 2 个 unicode 字符转换为 char。

有没有一种方法可以通过将 unicode 转换为字符串来使用相同的方法来显示所有颜色变化?我必须使用其他方法吗?不幸的是,手动转换所有 unicode 不是一种选择。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我不确定如何将 2 个 unicode 字符转换为 char

您不会将两个字符转换为单个字符;您将它们保存为字符串,布局引擎将它们显示为单个表情符号。

String 构造函数采用 UTF-16 编码形式的字符串,UTF-16 将使用 代理对 表示补充平面字符(U+10000 或更高),这是一个序列的两个字符。要为带有肤色修饰符的表情符号构造字符串,您需要传入 UTF-16 字符序列。例如,对于由 Unicode 字符序列 组成的字符串,构造函数需要一个由 4 个字符组成的数组,它们是该序列的 UTF-16 表示,[0xD83E, 0xDD1A, 0xD83C, 0xDFFC ]。

Character.toChars() 调用将为 Unicode 代码点生成 UTF-16 表示。如果代码点是补充平面字符,则 toChars() 将为该字符生成代理对。但是您的情况需要两个单独的 Unicode 字符,这不能在单个 toChars() 调用中处理。两个单独的 toChars() 调用可以用于序列中的两个 Unicode 字符,但您需要一个包含四个字符的组合数组的字符串。

我不精通 Java 或 android 类,因此无法为您提供最有效的方法。我相信你可以使用 StringBuilder,用第一个字符构造然后附加第二个字符。但可能有更直接的方式。

【讨论】:

我之前尝试过,不幸的是 textview 只是打印 \U0001f4ea 我在上面的回答中添加了更多信息。希望这足以让您畅通无阻。

以上是关于通过 unicode 在文本字段中显示具有肤色变化的表情符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符

如何读取文本文件并将其显示在 win 32 unicode 字符集中的编辑控件上?

代号一:键盘出现后文本字段大小和格式发生变化

在具有不同文本框的报表中显示表记录

具有多种文本颜色的文本视图android [重复]

需要使用 jquery 对具有部分文本字段名称的值进行匹配并返回结果