String.prototype.charCodeAt()
Метод charCodeAt()
(код символу на позиції) значень String
повертає ціле число в діапазоні від 0
до 65535
, що відповідає кодовій одиниці UTF-16 за переданим індексом в рядку.
Метод charCodeAt()
завжди індексує рядок як послідовність кодових одиниць UTF-16, тож може повертати самотні сурогати. Щоб отримати цілу кодову точку Unicode на заданому індексі, слід використати String.prototype.codePointAt()
.
Спробуйте його в дії
Синтаксис
charCodeAt(index)
Параметри
index
Індекс від нуля символу, що має бути повернений. Перетворюється на ціле число —
undefined
перекидається на 0.
Повернене значення
Ціле число між 0
і 65535
, що відповідає значенню кодової одиниці UTF-16 символу за заданим index
. Якщо index
лежить поза діапазоном 0
– str.length - 1
, то charCodeAt()
повертає NaN
.
Опис
Символи в рядку індексуються зліва направо. Індекс першого символу - 0
, а індекс останнього символу в рядку, що зветься, str
, – str.length - 1
.
Кодові одиниці Unicode мають діапазон від 0
до 1114111
(0x10FFFF
). charCodeAt()
завжди повертає значення, менші 65536
, тому що вищі кодові точки представлені парою 16-бітових псевдосимволів-сурогатів. Таким чином, щоб отримати цілий символ зі значенням більше 65535
, необхідно отримати не тільки charCodeAt(i)
, але й charCodeAt(i + 1)
(як якби оброблявся рядок з двома символами), або використати замість цього codePointAt(i)
. Про Unicode – читайте Символи UTF-16, кодові точки Unicode та графемні кластери.
Приклади
Застосування charCodeAt()
Наступний приклад повертає 65
, значення A в Unicode.
"ABC".charCodeAt(0); // повертає 65
Метод charCodeAt()
може повертати самотні сурогати, що не є дійсними символами Unicode.
const str = "𠮷𠮾";
console.log(str.charCodeAt(0)); // 55362, або d842, що є не дійсним символом Unicode
console.log(str.charCodeAt(1)); // 57271, або dfb7, що є не дійсним символом Unicode
Щоб отримати цілу кодову точку Unicode на заданому індексі, слід використати String.prototype.codePointAt()
.
const str = "𠮷𠮾";
console.log(str.codePointAt(0)); // 134071
Примітка: Уникайте власної реалізації
codePointAt()
за допомогоюcharCodeAt()
. Переведення сурогатів UTF-16 у кодові точки Unicode – складне, іcodePointAt()
може бути більш продуктивним, оскільки він безпосередньо використовує приховане представлення рядка. Встановіть поліфіл дляcodePointAt()
, якщо це необхідно.
Нижче – можливий алгоритм перетворення пари кодових одиниць UTF-16 на кодову точку Unicode, адаптований з FAQ Unicode:
// сталі
const LEAD_OFFSET = 0xd800 - (0x10000 >> 10);
const SURROGATE_OFFSET = 0x10000 - (0xd800 << 10) - 0xdc00;
function utf16ToUnicode(lead, trail) {
return (lead << 10) + trail + SURROGATE_OFFSET;
}
function unicodeToUTF16(codePoint) {
const lead = LEAD_OFFSET + (codePoint >> 10);
const trail = 0xdc00 + (codePoint & 0x3ff);
return [lead, trail];
}
const str = "𠮷";
console.log(utf16ToUnicode(str.charCodeAt(0), str.charCodeAt(1))); // 134071
console.log(str.codePointAt(0)); // 134071
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
charCodeAt
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 4 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |