17

以下似乎不正确

"".charCodeAt(0);  // returns 55357 in both Firefox and Chrome

那是一个名为 ROCKET (U+1F680) 的 Unicode 字符,十进制应该是 128640。

这是针对正在编写的 unicode 应用程序。似乎大多数但不是来自 unicode 6 的所有字符都停留在 55357。

我该如何解决?谢谢。

4

3 回答 3

10

JavaScript 使用 UTF-16 编码;详情请看这篇文章

BMP 之外的字符,例如 U+1D306 用于中心 () 的四元组,只能使用两个 16 位代码单元以 UTF-16 编码:0xD834 0xDF06。这称为代理对。请注意,代理对仅表示单个字符。

代理对的第一个代码单元始终在 0xD800 到 0xDBFF 的范围内,称为高代理或前导代理。

代理对的第二个代码单元始终在 0xDC00 到 0xDFFF 的范围内,称为低代理或跟踪代理。

您可以像这样解码代理对:

codePoint = (text.charCodeAt(0) - 0xD800) * 0x400 + text.charCodeAt(1) - 0xDC00 + 0x10000

完整的代码可以在Mozilla 的 charCodeAt 文档中找到。

于 2013-03-03T02:40:29.780 回答
5

试过这个:

> "".charCodeAt(0);
55357

> "".charCodeAt(1);
56960

关于 SO 的相关问题:

您可能也想看看这个:

于 2013-03-03T02:36:33.697 回答
0

我认为这是因为他们向您返回了该字符的第一个代码单元 UTF-16 编码。我不确定你能做多少,因为它们返回一个 16 位值——我可能会尝试从前两个代码单元手动解码字符,然后用 UTF-32 编码,这似乎是你想要什么。

于 2013-03-03T02:34:27.270 回答