16

在 JavaScript 中,我可以这样做:

foo = "\u2669" // 1/4 note

但我不能这样做

foo = "\u1D15D" // full note  -five hex digits

它将被解释为“\u1D15”后跟“D”

有什么解决方法吗?

2012-07-09 更新:ECMAScript Harmony 提案现在包括对所有 Unicode 字符的支持。

4

5 回答 5

21

尝试将 unicode 放在大括号之间:'\u{1D15D}'.

于 2018-10-24T15:38:54.967 回答
7

fromCharCode 的 MDN 文档中,他们注意到 javascript 只会自然地处理不超过 0xFFFF 的字符。但是,他们也有一个 fromCharCode 的固定方法的实现,可以做你想做的事情(转载如下):

function fixedFromCharCode (codePt) {
    if (codePt > 0xFFFF) {
        codePt -= 0x10000;
        return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF));
    }
    else {
        return String.fromCharCode(codePt);
    }
}

foo = fixedFromCharCode(0x1D15D);
于 2012-05-16T09:25:47.840 回答
1

如今,您可以简单地使用String.fromCodePoint(),如MDN中所述。例如:

> String.fromCodePoint(0x1f0a1)
""
于 2020-03-09T23:29:32.867 回答
0

我做了一点检查,似乎附近没有完整的注释0x2669。(Unicode字符表

虽然 using0x01D15D确实给了我一个未知的 unicode 字符,但这可能是因为我没有音乐字体。Javascript 将尝试尽可能解析为字节,并且0x1D15D使用 2.5 字节填充它将0使其成为 3 并且可解析。

这也很方便:unicode.org/charts/PDF/U1D100.pdf

于 2012-05-16T09:34:33.187 回答
0

你可以使用这个:

function fromOutsideBMP(cp) {
// 0x01D120
  var x=cp-0x10000;
  var top10=parseInt("11111111110000000000",2);
  var end10=parseInt("1111111111",2);
  var part1=(x&top10)/1024+0xD800;
  var part2=(x&end10)+0xDC00;
  var s=String.fromCharCode(part1)+String.fromCharCode(part2);
  return s;
}

例子:

> fromOutsideBMP(0x01d122)
  ""
>
于 2012-05-27T10:12:51.043 回答