我正在尝试通过以下方式将十六进制值1f600
(即笑脸表情符号)转换为其字符表示形式:
String.fromCharCode(parseInt("1f600", 16));
但这只会生成一个正方形符号。
答案 0 :(得分:7)
大多数表情符号需要两个代码单元,包括一个。 fromCharCode
以代码单位工作(JavaScript的“字符” are UTF-16 code units除了可以接受无效的代理对之外),而不是代码点(实际的Unicode字符)。
在现代环境中,您将使用String.fromCodePoint
或仅使用Unicode codepoint 转义序列(\u{XXXXX}
而非\uXXXX
,这是针对代码单元的) 。也不需要parseInt
:
console.log(String.fromCodePoint(0x1f600));
console.log("\u{1f600}");
在较旧的环境中,您必须提供代理对,在这种情况下为0xD83D 0xDE00:
console.log("\uD83D\uDE00");
...或use a polyfill for fromCodePoint
。
如果由于某种原因您不想在较旧的环境中使用polyfill,并且起点是代码点,则必须找出代码单元。您可以在上方链接的MDN的polyfill中查看操作方法,或者按以下说明the Unicode UTF-16 FAQ进行操作:
使用以下类型定义
typedef unsigned int16 UTF16; typedef unsigned int32 UTF32;
第一个代码段从字符代码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;
其中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));
答案 1 :(得分:2)
JavaScript使用UTF-16,因此您需要获取U+1F600
而不是U+D83D U+DE00
-即String.fromCharCode(0xd83d, 0xde00)
请注意,您可以使用0x####
代替parseInt("####",16)
。
要将UTF-8位置转换为其等效的UTF-16,请按以下步骤操作:
var input = 0x1f600;
var code = input - 0x10000;
var high = (code >> 10) + 0xD800;
var low = (code & 0x3FF) + 0xDC00;
var output = String.fromCharCode(high, low);
答案 2 :(得分:0)
使用fromCodepoint
函数代替fromCharCode
String.fromCodePoint(0x1f600)