Как использовать символы символа Юникода длиной пять цифр в JavaScript

В JavaScript я могу это сделать:

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

Но я не могу этого сделать

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

Он будет интерпретироваться как "\ u1D15", за которым следует "D"

Есть ли какие-либо обходные пути для этого?

UPDATE 2012-07-09: Предложение для ECMAScript Harmony теперь включает поддержку всех символов Unicode.

Ответ 1

В документации MDN для fromCharCode они отмечают, что javascript будет естественно обрабатывать символы до 0xFFFF. Тем не менее, у них также есть реализация фиксированного метода forCharCode, который может делать то, что вы хотите (воспроизведено ниже):

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);

Ответ 2

Я сделал небольшую проверку, и кажется, что нет полной заметки рядом с 0x2669. (таблица символов Unicode)

Хотя использование 0x01D15D дает мне неизвестный символ юникода, это может быть связано с тем, что у меня нет музыкального шрифта. Javascript будет пытаться анализировать в качестве байта, как он может, и 0x1D15D составляет 2,5 байта, заполняя его с помощью 0, что сделает его 3 и выполнимым.

Также это было очень удобно: unicode.org/charts/PDF/U1D100.pdf

Ответ 3

Вы можете использовать это:

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)
  "𝄢"
>