Выражение символов Unicode UTF-16 в JavaScript - PullRequest
15 голосов
/ 19 августа 2011

Для выражения, например, символа U + 10400 в JavaScript, я использую "\uD801\uDC00" или String.fromCharCode(0xD801) + String.fromCharCode(0xDC00).Как мне это выяснить для данного символа юникода?Я хочу следующее:

var char = getUnicodeCharacter(0x10400);

Как мне найти 0xD801 и 0xDC00 из 0x10400?

Ответы [ 2 ]

17 голосов
/ 19 августа 2011

Основываясь на статье Википедии , данной Хеннингом Маххольмом, следующая функция вернет правильный символ для кодовой точки:

function getUnicodeCharacter(cp) {

    if (cp >= 0 && cp <= 0xD7FF || cp >= 0xE000 && cp <= 0xFFFF) {
        return String.fromCharCode(cp);
    } else if (cp >= 0x10000 && cp <= 0x10FFFF) {

        // we substract 0x10000 from cp to get a 20-bits number
        // in the range 0..0xFFFF
        cp -= 0x10000;

        // we add 0xD800 to the number formed by the first 10 bits
        // to give the first byte
        var first = ((0xffc00 & cp) >> 10) + 0xD800

        // we add 0xDC00 to the number formed by the low 10 bits
        // to give the second byte
        var second = (0x3ff & cp) + 0xDC00;

        return String.fromCharCode(first) + String.fromCharCode(second);
    }
}
4 голосов
/ 02 февраля 2012

Как мне найти 0xD801 и 0xDC00 из 0x10400?

JavaScript использует UCS-2 для внутреннего использования. Вот почему String#charCodeAt() не делаетработает не так, как вы хотели бы.

Если вы хотите получить кодовую точку каждого символа Unicode (включая символы не-BMP) в строке, вы можете использовать Punycode.js вспомогательные функции для преобразования между строками UCS-2 и кодовыми точками UTF-16:

// String#charCodeAt() replacement that only considers full Unicode characters
punycode.ucs2.decode('?'); // [119558]
punycode.ucs2.decode('abc'); // [97, 98, 99]

Если вам не нужно делать это программно, хотя у вас уже есть символ, просто используйте mothereff.in / js-escapes .Он скажет вам , как экранировать любой символ в JavaScript .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...