如何在JavaScript中使用五位数长的Unicode字符

如何在JavaScript中使用五位数长的Unicode字符,javascript,unicode,ecmascript-harmony,Javascript,Unicode,Ecmascript Harmony,在JavaScript中,我可以做到这一点: foo = "\u2669" // 1/4 note 但我不能这么做 foo = "\u1D15D" // full note -five hex digits 它将被解释为“\u1D15”后跟“D” 有什么解决办法吗 更新2012-07-09:现在包括对所有Unicode字符的支持。在中,他们注意到javascript只能自然地处理高达0xFFFF的字符。但是,他们还为fromCharCode提供了一个固定方法的实现,该方法可以实现您想要的功

在JavaScript中,我可以做到这一点:

foo = "\u2669" // 1/4 note
但我不能这么做

foo = "\u1D15D" // full note  -five hex digits
它将被解释为“\u1D15”后跟“D”

有什么解决办法吗

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

在中,他们注意到javascript只能自然地处理高达0xFFFF的字符。但是,他们还为fromCharCode提供了一个固定方法的实现,该方法可以实现您想要的功能(如下所示):


我做了一点检查,发现
0x2669
附近没有完整的注释。()

虽然使用
0x01D15D
会给我一个未知的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;
}
例如:

>来自外部BMP(0x01d122)

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

现在,您只需使用
String.fromCodePoint()
,如中所述。例如:

>String.fromCodePoint(0x1f0a1)

“背景是我的一个学生正在尝试的一个关于画布上音符的小应用程序:(没什么特别的。他只编写了2个月的程序,每周几个小时。)可能重复的。:“你必须使用代理对”Javascript从1995年之前就仍然停留在Unicode 1中。对于现代文本处理来说,这很糟糕。如果您安装了正确的字体,那么执行
String。fromCharCode(0x01D15D)
将为您呈现该字符。您是否有一个这样的字体示例?我很想看到fromCharCode现在支持BMP之外的代码,但我今天读到的所有内容似乎都表明它不支持。(另请参见上文弗里德里克·哈米迪的评论)我刚刚在歌剧中做了一个快速测试,它吐出了“无法渲染字符”的字符。这让我相信你需要字体来呈现角色。下载并运行了测试。fixedFromCharCode有效。参考:这是一条路!更多信息请阅读这里:
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;
}