【问题标题】:Javascript "????".charCodeAt(0) stuck at 55357?Javascript "????".charCodeAt(0) 停留在 55357?
【发布时间】:2013-02-17 09:00:34
【问题描述】:

以下内容似乎不正确

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

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

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

我该如何解决?谢谢。

【问题讨论】:

标签: javascript unicode


【解决方案1】:

JavaScript 使用 UTF-16 编码;详情见this article

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

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

代理对的第二个代码单元总是在从 0xDC00 到 0xDFFF,称为低代理或跟踪代理。

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

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

完整的代码可以在Mozilla documentation for charCodeAt找到。

【讨论】:

【解决方案2】:

试过了:

> "?".charCodeAt(0);
55357

> "?".charCodeAt(1);
56960

关于 SO 的相关问题:

你可能也想看看这个:

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多