将十六进制值转换为unicode字符

And*_*Dev 0 javascript

我试图通过以下方式将十六进制值1f600(即笑脸表情符号)转换为其字符表示形式:

String.fromCharCode(parseInt("1f600", 16));
Run Code Online (Sandbox Code Playgroud)

但这只是生成一个方形符号.

T.J*_*der 7

大多数表情符号需要两个代码单元,包括那个代码单元.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)

...或使用polyfillfromCodePoint.

如果由于某种原因您不想在旧环境中使用polyfill,并且您的起点是代码点,则必须确定代码单元.你可以在上面链接的MDN的polyfill中看到如何做到这一点,或者这里是Unicode UTF-16常见问题解答所说的:

使用以下类型定义

typedef unsigned int16 UTF16;
typedef unsigned int32 UTF32;
Run Code Online (Sandbox Code Playgroud)

第一个片段从字符代码C计算高(或前导)代理.

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;
Run Code Online (Sandbox Code Playgroud)

其中X,U和W对应于表3-5 UTF-16位分布中使用的标签.下一个片段对低代理人做同样的事情.

const UTF16 LO_SURROGATE_START = 0xDC00
UTF16 X = (UTF16) C;
UTF16 LoSurrogate = (UTF16) (LO_SURROGATE_START | X & ((1 << 10) - 1));
Run Code Online (Sandbox Code Playgroud)