我今天发现了这个,但无法弄清楚它失败的原因:
基本上,如果你采取一些模糊的符号,如
""
然后在Chrome控制台中"".charCodeAt(0)
- 您将获得代码55357
,但当您使用String.fromCharCode(55357)
恢复操作时,它会生成"�"
即使我这样做String.fromCharCode("".charCodeAt(0))
,它也会生成"�"
,但String.fromCharCode("".charCodeAt(0)).charCodeAt(0)
仍为55357
,因此信息不会丢失,并且暗示它是Chrome无法找到要映射到55357
的正确符号。
为什么Chrome无法正确表示符号?是因为它无法正确映射到字体吗?如何将双重转化再次显示为""
?
答案 0 :(得分:1)
如果您记录
"".length
你会得到2
,也就是说,字符串实际上包含2个字符,而不是1个字符。这是因为JS仅支持16位unicode(BMP)并使用“代理对”编码“星体平面”符号。您的内部符号为\uD83D\uDC49
,当您执行.charCodeAt(0)
时,您只会获得\uD83D
,这是无效的unicode。
答案 1 :(得分:1)
以下脚本将获得'正确'字符代码(128073
)
(("".charCodeAt(0)-0xD800)*0x400) + ("".charCodeAt(1)-0xDC00) + 0x10000
然后可以将其转换为HTML char代码,如下所示:
"&#x"+(((("".charCodeAt(0)-0xD800)*0x400) + ("".charCodeAt(1)-0xDC00) + 0x10000)).toString(16)+";"
字符串扩展名:
String.prototype.charCodeUTF32 = function(){
return ((((this.charCodeAt(0)-0xD800)*0x400) + (this.charCodeAt(1)-0xDC00) + 0x10000));
};
希望这可以节省你一些时间。
答案 2 :(得分:-1)
TypeScript转换包含表情符号的文本:
private emoji2html(text: string): string {
const regexAstralSymbols = /([\uD800-\uDBFF])([\uDC00-\uDFFF])/g;
return text.replace(regexAstralSymbols, (m, first, second) =>
`&#x${(first + second).charCodeUTF32().toString(16)};`);
}