为什么这样做:
<p id="emoji">😄</p>
而这不会:
document.getElementById("emoji").innerHTML = String.fromCharCode(parseInt('1f604', 16));
为什么这样做:
<p id="emoji">😄</p>
而这不会:
document.getElementById("emoji").innerHTML = String.fromCharCode(parseInt('1f604', 16));
JS 术语中的“char”实际上是一个 UTF-16 代码单元,而不是完整的 Unicode 字符。(这种可悲的事态起源于没有区别的古代*。)要使用基本多语言平面之外的字符,您必须以 UTF-16 编码的形式编写两个 16的代理对-位代码单元:
String.fromCharCode(0xD83D, 0xDE04)
在 ECMAScript 6 中,我们将获得一些接口,让我们可以像处理完整的 Unicode 代码点一样处理字符串,尽管它们是不完整的,并且只是 String 类型的一个外观,仍然作为代码单元序列存储。然后我们将能够做到:
String.fromCodePoint(0x1F604)
请参阅此问题以获取一些 polyfill 代码,以便您在当今的浏览器中使用此功能。
(*:当我使用时间机器时,我将让希特勒一个人呆着,回到更早的时候发明 UTF-8。UTF-16 绝对不是!)
如果您不想包含String.fromCodePoint()
在代码中,也可以使用 hacky 方法。它包括创建一个虚拟元素......
elem=document.createElement('p')
... 用工作 HTML 填充它...
elem.innerHTML = "😄"
... 最终得到它的value
value = elem.innerHTML
简而言之,这是因为一旦您设置了 HTML 容器的值,该值就会被转换为相应的字符。
希望我能帮上忙。