为什么多个unicode转换String.fromCharCode(“”。charCodeAt(0))破坏了Chrome控制台中的符号以及如何修复它?

时间:2016-06-09 09:40:00

标签: javascript google-chrome unicode fonts character-encoding

我今天发现了这个,但无法弄清楚它失败的原因:

基本上,如果你采取一些模糊的符号,如

"" 然后在Chrome控制台中"".charCodeAt(0) - 您将获得代码55357,但当您使用String.fromCharCode(55357)恢复操作时,它会生成"�"

即使我这样做String.fromCharCode("".charCodeAt(0)),它也会生成"�",但String.fromCharCode("".charCodeAt(0)).charCodeAt(0)仍为55357,因此信息不会丢失,并且暗示它是Chrome无法找到要映射到55357的正确符号。

为什么Chrome无法正确表示符号?是因为它无法正确映射到字体吗?如何将双重转化再次显示为""

3 个答案:

答案 0 :(得分:1)

如果您记录

"".length

你会得到2,也就是说,字符串实际上包含2个字符,而不是1个字符。这是因为JS仅支持16位unicode(BMP)并使用“代理对”编码“星体平面”符号。您的内部符号为\uD83D\uDC49,当您执行.charCodeAt(0)时,您只会获得\uD83D,这是无效的unicode。

更多关于https://mathiasbynens.be/notes/javascript-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)};`);
  }