在 JavaScript 中,我可以这样做:
foo = "\u2669" // 1/4 note
但我不能这样做
foo = "\u1D15D" // full note -five hex digits
它将被解释为“\u1D15”后跟“D”
有什么解决方法吗?
2012-07-09 更新:ECMAScript Harmony 提案现在包括对所有 Unicode 字符的支持。
在 JavaScript 中,我可以这样做:
foo = "\u2669" // 1/4 note
但我不能这样做
foo = "\u1D15D" // full note -five hex digits
它将被解释为“\u1D15”后跟“D”
有什么解决方法吗?
2012-07-09 更新:ECMAScript Harmony 提案现在包括对所有 Unicode 字符的支持。
尝试将 unicode 放在大括号之间:'\u{1D15D}'
.
在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);
如今,您可以简单地使用String.fromCodePoint()
,如MDN中所述。例如:
> String.fromCodePoint(0x1f0a1)
""
我做了一点检查,似乎附近没有完整的注释0x2669
。(Unicode字符表)
虽然 using0x01D15D
确实给了我一个未知的 unicode 字符,但这可能是因为我没有音乐字体。Javascript 将尝试尽可能解析为字节,并且0x1D15D
使用 2.5 字节填充它将0
使其成为 3 并且可解析。
这也很方便:unicode.org/charts/PDF/U1D100.pdf
你可以使用这个:
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)
""
>