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

时间:2018-08-27 09:42:44

标签: javascript

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

String.fromCharCode(parseInt("1f600", 16));

但这只会生成一个正方形符号。

3 个答案:

答案 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)