通过 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 字符