我试图通过以下方式将十六进制值1f600(即笑脸表情符号)转换为其字符表示形式:
String.fromCharCode(parseInt("1f600", 16));
Run Code Online (Sandbox Code Playgroud)
但这只是生成一个方形符号.
大多数表情符号需要两个代码单元,包括那个代码单元.fromCharCode以代码为单位工作(JavaScript的"字符" 是UTF-16代码单元,但可以容忍无效的代理对),而不是代码点(实际的Unicode字符).
在现代环境中,您String.fromCodePoint只使用或仅使用Unicode 代码点转义序列(\u{XXXXX}而不是\uXXXX代码单元).也没有必要parseInt:
console.log(String.fromCodePoint(0x1f600));
console.log("\u{1f600}");Run Code Online (Sandbox Code Playgroud)
在旧环境中,您必须提供代理对,在这种情况下为0xD83D 0xDE00:
console.log("\uD83D\uDE00");Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您不想在旧环境中使用polyfill,并且您的起点是代码点,则必须确定代码单元.你可以在上面链接的MDN的polyfill中看到如何做到这一点,或者这里是Unicode UTF-16常见问题解答所说的:
使用以下类型定义
Run Code Online (Sandbox Code Playgroud)typedef unsigned int16 UTF16; typedef unsigned int32 UTF32;第一个片段从字符代码C计算高(或前导)代理.
Run Code Online (Sandbox Code Playgroud)const UTF16 HI_SURROGATE_START = 0xD800 UTF16 X = (UTF16) C; UTF32 U = (C >> 16) & ((1 << 5) - 1); UTF16 W = (UTF16) U - 1; UTF16 HiSurrogate = HI_SURROGATE_START | (W << 6) | X >> 10;其中X,U和W对应于表3-5 UTF-16位分布中使用的标签.下一个片段对低代理人做同样的事情.
Run Code Online (Sandbox Code Playgroud)const UTF16 LO_SURROGATE_START = 0xDC00 UTF16 X = (UTF16) C; UTF16 LoSurrogate = (UTF16) (LO_SURROGATE_START | X & ((1 << 10) - 1));
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |