Выражение символов Unicode UTF-16 в JavaScript
Чтобы выразить, например, символ U + 10400 в JavaScript, я использую "\uD801\uDC00"
или String.fromCharCode(0xD801) + String.fromCharCode(0xDC00)
. Как я могу понять это для данного символа Юникода? Я хочу следующее:
var char = getUnicodeCharacter(0x10400);
Как найти 0xD801
и 0xDC00
из 0x10400
?
Ответы
Ответ 1
На основе статьи wikipedia, предоставленной Хеннинг Махолмом, следующая функция вернет правильный символ для кодовой точки:
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);
}
}
Ответ 2
Как найти 0xD801
и 0xDC00
из 0x10400
?
JavaScript использует UCS-2 внутренне. Вот почему String#charCodeAt()
не работает так, как вам нужно.
Если вы хотите получить кодовую точку каждого символа Unicode (включая символы не BMP) в строке, вы можете использовать Punycode.js s для преобразования между строками 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.