除了两个解耦的表情符号之外,几乎所有表情符号都可以渲染?

问题描述 投票:0回答:1

我的问题与这个非常相似:Flutter 正在解耦表情符号?

通过使用上一篇文章中提到的 noto notoColorEmoji(notoColorEmojiCompat 在字体包中不再可用),我可以渲染除这两个之外的大多数表情符号:

https://emojipedia.org/head-shaking-horizontally🙂u200d↔️

https://emojipedia.org/head-shaking-vertically🙂u200d↕️

(此时或写作时都被标记为“新”)。

从表情符号百科网站复制这两个内容时也无法在此处正确呈现!

我可以在 Android 模拟器的本机表情符号键盘中看到它们,但如果我输入它们,它们会显示为

🙂u200d↔️ 水平方向

🙂u200d↕️ 垂直

我不仅希望表情符号能够正确显示,而且还希望在未来的表情符号无法正常工作时完全防止这种行为。这种解耦破坏了我的 UI,因为用户被要求选择一个表情符号,但通过选择这两个表情符号,会出现两个表情符号。 -__-

简而言之,我希望我的应用程序支持所有可能类型的表情符号,并且永远不会无法将任何表情符号键盘上出现的任何表情符号呈现为单个表情符号。

@gopelkujo 我正在编辑第一篇文章,向您展示以下图片。似乎我在我的 Linux 主机 (Fedora 40) 上也遇到了同样的问题,我注意到在 Firefox 中的 LinkedIn 聊天中我得到了相同的行为,并且我有两个表情符号代替了一个,都是新的表情符号。 (其中一个比另一个大,因为我用鼠标悬停,以表明将鼠标悬停在该位置上会弹出两个表情符号,因为它们是应该是单个表情符号的占位符)

我的猜测是,与当前的表情符号规范相比,某些软件包已经过时,并且 LinkedIn 在某些方面领先于 Fedora 或 Firefox,但我不确定它可能是什么。

LinkedIn Issue

flutter dart emoji
1个回答
0
投票

简而言之,我希望我的应用程序支持所有可能类型的表情符号,并且永远不会无法将任何表情符号键盘上出现的任何表情符号呈现为单个表情符号。

这是不可能的。您所看到的是不受支持的 ZWJ(零宽度连接器)序列的正确行为,包括此类表情符号。这些是在 Unicode 15.1 中添加的。您使用的渲染引擎必须至少支持 Unicode 15.1 才能显示它们。即使您从头开始构建自己的渲染引擎,您也无法支持您不知道的未来 ZWJ 序列。对于 Unicode 中的任何字符都是如此。渲染引擎必须知道如何处理它,否则无法正确显示。

即使渲染引擎支持表情符号,字体也可能不支持。它必须有一个字形。如果没有,就没有办法显示。

有些网站不使用字体来显示表情符号。他们插入自己的图像。当表情符号出现在文本之后(有时甚至在文本之后几秒钟)时,您经常可以看到这一点。

对于不支持的 ZWJ 序列的具体情况,我不建议尝试修复此问题,但如果您这样做,它会如下所示:

您可以解析文本,搜索 ZWJ 序列(它们包括字符 U+200D),保留您的字体支持的所有 ZWJ 序列的列表,如果不支持,则将序列替换为您想要的字符来展示。

例如,您将评估“🙂u200d↔️”,即序列“🙂,U+200D,↔️”。 您可以在创建字体支持的序列所需的表中查找此内容。如果它不在上面,您将删除 U+200D 和 ↔️,留下 🙂。然而,在我看来,这通常对用户不利,因为它会改变字符的含义。 IMO,🙂↔️ 是一种更好的渲染方式,因为它丢失的信息更少。但您可以实施您认为最适合用户的方式。

科学家🧑u200d🔬等表情符号也存在类似问题,它会被简化为人🧑,或者跨性别旗帜🏳️u200d⚧️,它会被简化为白旗🏳️。我认为这些变化会非常令人困惑,而混乱的表情符号会更清晰(这就是为什么它是显示所有这些变化的标准)。

© www.soinside.com 2019 - 2024. All rights reserved.