Chromium在通过JS插入后无法呈现表情符号



我在React项目中有一个表情符号选取器,我可以用它将表情插入文本字段。插入后,表情符号可见并正确呈现。但是,如果插入另一个表情符号,则所有以前的表情符号都将替换为未知字符符号。尽管每个表情符号都是完整有效的字符。我还尝试将消息存储在React State中,并通过程序将它们转换为代码点,但问题仍然存在。参见代码示例:https://gist.github.com/J-Cake/8ab27a809aaf0cf14a7e2b78cbcbacf2我想知道代码中是否有一个简单的错误,或者我遗漏了更大的内容。

编辑:我可能会补充说,我在Ubuntu上,表情符号支持率可能很低,但看看表情符号测试页/表情符号确实呈现的事实,这表明这与问题无关。

编辑2:我还发现这个问题在JS控制台和Firefox中仍然存在。

我找到了答案。

我在阅读MDN文档时注意到了以下免责声明:

警告:当空字符串("")用作分隔符时,字符串不是按用户感知的字符(字形簇(或unicode字符(代码点(分割,而是按UTF-16代码单元分割。这会破坏代理项对。请参阅StackOverflow上的"如何在JavaScript中为字符数组获取字符串?"。

如果我没有注意到控制台中有什么奇怪的东西,我会完全忽略这一点。我注意到每个表情符号上都印着两个字符。我认为这是unicode的一个奇怪错误,并将其驳回。原来修复是在numerify函数中;将str.split替换为Array.from(str),并查看一个工作示例。

以下是我如何在React项目中使用表情符号:

emojis = [
'128512',
'128514',
'128519'
];
emojis.map(emoji => <span>{String.fromCodePoint(emoji)}</span>)

正如你所看到的,我使用十进制拼写。我想十六进制也行。

我使用以下图表:https://www.w3schools.com/charsets/ref_emoji_smileys.asp

编辑:

尽管你已经修复了它,但我的建议是:

insert(emoji: BaseEmoji) {
this.setState((prev: State) => ({
messageContent: [
...prev.messageContent.slice(0, prev.cursorStart),
...[emoji.native.codePointAt(0)],
...prev.messageContent.slice(prev.cursorEnd + 1),
],
cursorStart: prev.cursorStart + 1,
cursorEnd: prev.cursorStart + 1,
}));
}