String.prototype.charCodeAt()

Метод charCodeAt() вертає ціле число в діапазоні між 0 та 65535, що відображає кодову одиницю UTF-16 за наданим індексом.

Кодова одиниця UTF-16 співпадає з кодом символа Юнікоду для кодів символів, які можуть бути представлені єдиною кодовою одиницею UTF-16. Якщо код символа Юнікоду не може бути представлений єдиною кодовою одиницею UTF-16 (бо його значення більше за 0xFFFF), тоді повернена кодова одиниця буде першою частиною сурогатної пари для коду символа. Якщо вам потрібен весь код символа, використовуйте codePointAt().

Синтаксис

str.charCodeAt(index)

Параметри

index
Ціле число, що більше або дорівнює 0 та менше за довжину рядка. Якщо index не є числом, він за замовчуванням прирівнюється до 0.

Значення, що повертається

Число, що відображає значення кодової одиниці UTF-16 для символа за наданим індексом index. Якщо index знаходиться за межами діапазону, charCodeAt() повертає NaN.

Опис

Коди символів Юнікоду знаходяться в діапазоні від 0 до 1114111 (0x10FFFF). Перші 128 кодів символів Юнікоду повністю співпадають з кодуванням символів ASCII. (Інформацію щодо Юнікоду дивіться у Посібнику JavaScript.)

Заувага: charCodeAt() завжди поверне значення, менше за 65536. Тому що більші коди символів відображаються парою (з меншим значенням) "сурогатних" псевдосимволів, що складають реальний символ.

Тому, щоб дослідити (чи відтворити) повний символ для значень окремих символів від 65536 та більше, для таких символів необхідно отримувати не лише charCodeAt(i), але також charCodeAt(i+1) (ніби маніпулюючи рядком з двох літер), або використовувати замість цього codePointAt(i). Дивіться приклади 2 та 3 (нижче).

charCodeAt() повертає NaN, якщо наданий індекс менший за 0, або якщо він дорівнює чи перевищує значення довжини рядка.

Зворотня сумісність: У історичних версіях (наприклад, JavaScript 1.2) метод charCodeAt() вертає число, що вказує значення набору символів ISO-Latin-1 для символа за наданим індексом. Набір символів ISO-Latin-1 знаходиться в діапазоні від 0 до 255. Перші 0-127 повністю співпадають з набором символів ASCII.

Приклади

Використання charCodeAt()

Наступний приклад вертає 65, значення Юнікоду для A.

'ABC'.charCodeAt(0)  // вертає 65

Виправлення charCodeAt() для обробки символів не базової багатомовної площини, якщо їхня наявність раніше у рядку невідома

Ця версія може використовуватись для циклів та подібного, коли невідомо, чи були присутні символи не з ББП до вказаної позиції.

function fixedCharCodeAt(str, idx) {
  // напр. fixedCharCodeAt('\uD800\uDC00', 0); // 65536
  // напр. fixedCharCodeAt('\uD800\uDC00', 1); // false
  idx = idx || 0;
  var code = str.charCodeAt(idx);
  var hi, low;
  
  // Високий сурогат (може міняти останнє шістнадцяткове значення на 0xDB7F
  // для обробки високих приватних сурогатів
  // як єдиних символів)
  if (0xD800 <= code && code <= 0xDBFF) {
    hi = code;
    low = str.charCodeAt(idx + 1);
    if (isNaN(low)) {
      throw 'Високий сурогат без наступного ' +
        'низького сурогату у fixedCharCodeAt()';
    }
    return (
      (hi - 0xD800) * 0x400) + 
      (low - 0xDC00) + 0x10000;
  }
  if (0xDC00 <= code && code <= 0xDFFF) { // Низький сурогат
    // Ми вертаємо false, щоб дозволити циклам пропустити
    // цю ітерацію, бо мали вже обробити
    // високий сурогат вище у попередній ітерації
    return false;
    // hi = str.charCodeAt(idx - 1);
    // low = code;
    // return ((hi - 0xD800) * 0x400) +
    //   (low - 0xDC00) + 0x10000;
  }
  return code;
}

Виправлення charCodeAt() для обробки символів не базової багатомовної площини, якщо їхня наявність раніше у рядку відома

function knownCharCodeAt(str, idx) {
  str += '';
  var code,
      end = str.length;

  var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
  while ((surrogatePairs.exec(str)) != null) {
    var li = surrogatePairs.lastIndex;
    if (li - 2 < idx) {
      idx++;
    }
    else {
      break;
    }
  }

  if (idx >= end || idx < 0) {
    return NaN;
  }

  code = str.charCodeAt(idx);

  var hi, low;
  if (0xD800 <= code && code <= 0xDBFF) {
    hi = code;
    low = str.charCodeAt(idx + 1);
    // Пройти на один далі, оскільки один з "символів"
    // є частиною сурогатної пари
    return ((hi - 0xD800) * 0x400) +
      (low - 0xDC00) + 0x10000;
  }
  return code;
}

Специфікації

Специфікація
ECMAScript Latest Draft (ECMA-262)
The definition of 'String.prototype.charCodeAt' in that specification.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
charCodeAtChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 4Opera Full support 4Safari Full support 1WebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support 10.1Safari iOS Full support 1Samsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також