CharCodeAt: примеры (JAVASCRIPT)

Использование charCodeAt для получения кодов символов
Раздел: Строки, Кодировка
charCodeAt(index): number

Описание функции charCodeAt

Метод charCodeAt() является встроенным методом объектов String в JavaScript. Он возвращает числовое значение Unicode для символа, расположенного по указанному индексу в строке.

Этот метод часто используется при работе с нестандартными символами, обработке бинарных данных, сравнении символов без учета регистра или при необходимости манипулировать строками на низком уровне, оперируя кодами символов.

Синтаксис:
str.charCodeAt(index)

Аргументы:

  • index (целое число, необязательный): Позиция символа в строке, код которого требуется получить. Диапазон значений от 0 до str.length - 1. Если аргумент не указан, по умолчанию используется значение 0. Если индекс выходит за пределы допустимого диапазона, метод возвращает NaN.

Возвращаемое значение:

  • Целое число в диапазоне от 0 до 65535 (0xFFFF), представляющее код единицы UTF-16 для символа по указанному индексу.
  • Если позиция пуста или индекс выходит за границы строки, возвращается специальное значение NaN (Not-a-Number).

Краткие примеры использования

Получение кода первого символа

let str = 'Hello';
console.log(str.charCodeAt(0));
72

Использование без аргумента (по умолчанию 0)

console.log('A'.charCodeAt());
65

Работа с символами за пределами Basic Multilingual Plane (суррогатные пары)

let emoji = '????';
console.log(emoji.charCodeAt(0));
console.log(emoji.charCodeAt(1));
55357
56832

Индекс за пределами строки

let word = 'test';
console.log(word.charCodeAt(10));
NaN

Пустая позиция в строке

let str = 'A\uD83D\uDE00B'; // A????B
console.log(str.charCodeAt(2)); // Код второго элемента суррогатной пары
console.log(str.charCodeAt(3)); // Код 'B'
56832
66

Похожие функции в JavaScript

codePointAt()

Метод codePointAt() возвращает полную числовую точку кода Unicode для символа, включая символы из дополнительных плоскостей (значения больше 0xFFFF). Он корректно обрабатывает суррогатные пары, возвращая одно значение вместо двух отдельных кодов.

charAt()

Метод charAt() возвращает сам символ (подстроку) по указанному индексу, а не его числовой код. Используется, когда требуется именно символьное представление.

fromCharCode() и fromCodePoint()

Статические методы String.fromCharCode() и String.fromCodePoint() выполняют обратную операцию: создают строку из переданных числовых кодов Unicode. fromCodePoint() поддерживает полный диапазон Unicode.

Предпочтения: Для большинства символов BMP (Basic Multilingual Plane) подходит charCodeAt(). При работе с эмодзи, иероглифами или другими символами за пределами BMP рекомендуется использовать codePointAt(). Метод charAt() применяется, когда важен сам символ, а не его код.

Типичные ошибки

Путаница с индексацией

Начинающие разработчики иногда забывают, что индексация начинается с нуля.

let str = 'ABC';
console.log(str.charCodeAt(1)); // Код второго символа, 'B'
console.log(str.charCodeAt(3)); // За пределами строки
66
NaN

Ожидание строки от charCodeAt

Метод всегда возвращает число, а не строковое представление символа.

let result = 'A'.charCodeAt(0);
console.log(typeof result); // 'number', а не 'string'
number

Некорректная обработка суррогатных пар

Попытка получить один корректный код для символа, состоящего из двух суррогатных половин, с помощью charCodeAt даст два отдельных значения.

let emoji = '????';
let codes = [emoji.charCodeAt(0), emoji.charCodeAt(1)];
console.log(codes);
console.log(String.fromCharCode(codes[0], codes[1])); // Корректное восстановление
[55357, 56835]
????

Использование отрицательных индексов

Метод не поддерживает отрицательные индексы для отсчета с конца строки.

console.log('test'.charCodeAt(-1));
NaN

Изменения в спецификации

Метод charCodeAt() присутствует в языке с самых ранних версий ECMAScript (ES1) и с тех пор не претерпел значительных изменений в своем основном поведении. Основная семантика метода осталась неизменной.

Главное развитие в этой области связано с введением в ECMAScript 2015 (ES6) метода codePointAt(), который стал рекомендованным способом работы с символами за пределами Basic Multilingual Plane (BMP). Это дополнение не изменило charCodeAt, но предоставило более мощную альтернативу для определенных сценариев.

Также, начиная с ES3, явно определено возвращаемое значение NaN для индексов за пределами строки, что сделало поведение более предсказуемым.

Расширенные примеры применения

Проверка, является ли символ заглавной буквой латинского алфавита

Пример javascript
function isUpperCaseLatin(char) {
    let code = char.charCodeAt(0);
    return code >= 65 && code <= 90;
}
console.log(isUpperCaseLatin('A'));
console.log(isUpperCaseLatin('z'));
true
false

Создание простого шифра сдвига (шифр Цезаря)

Пример javascript
function caesarCipher(str, shift) {
    return str.split('')
              .map(char => {
                  let code = char.charCodeAt(0);
                  // Сдвигаем только латинские буквы
                  if (code >= 65 && code <= 90) { // A-Z
                      code = ((code - 65 + shift) % 26) + 65;
                  } else if (code >= 97 && code <= 122) { // a-z
                      code = ((code - 97 + shift) % 26) + 97;
                  }
                  return String.fromCharCode(code);
              })
              .join('');
}
console.log(caesarCipher('Hello, World!', 3));
Khoor, Zruog!

Подсчет частоты символов в строке

Пример javascript
function charFrequency(text) {
    let freq = {};
    for (let i = 0; i < text.length; i++) {
        let code = text.charCodeAt(i);
        freq[code] = (freq[code] || 0) + 1;
    }
    return freq;
}
let result = charFrequency('абракадабра');
console.log(result[1072]); // Код буквы 'а' в Unicode
5

Выявление не-ASCII символов

Пример javascript
function findNonAscii(str) {
    let positions = [];
    for (let i = 0; i < str.length; i++) {
        let code = str.charCodeAt(i);
        if (code > 127) {
            positions.push({ index: i, char: str[i], code: code });
        }
    }
    return positions;
}
console.log(findNonAscii('Café 2024'));
[ { index: 3, char: 'é', code: 233 } ]

Ручная обработка суррогатных пар для получения полного кода

Пример javascript
function getFullCodePoint(str, index) {
    let code = str.charCodeAt(index);
    // Проверяем, является ли код началом суррогатной пары (высокий суррогат)
    if (code >= 0xD800 && code <= 0xDBFF && str.length > index + 1) {
        let nextCode = str.charCodeAt(index + 1);
        // Проверяем, является ли следующий код низким суррогатом
        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {
            // Вычисляем полную точку кода
            return ((code - 0xD800) * 0x400) + (nextCode - 0xDC00) + 0x10000;
        }
    }
    return code;
}
let emoji = '????????';
console.log(getFullCodePoint(emoji, 0).toString(16)); // Флаг Финляндии состоит из двух символов региона
console.log(getFullCodePoint(emoji, 2).toString(16));
1f1eb
1f1ee

Аналоги в других языках программирования

Python: ord() и chr()

Функция ord() возвращает числовой код Unicode для переданного символа (строки длиной 1). Функция chr() выполняет обратное преобразование. Обе функции работают с полным диапазоном Unicode.

print(ord('A'))
print(chr(65))
65
A

PHP: mb_ord() и mb_chr()

В PHP для многобайтовых кодировок используются функции mb_ord() и mb_chr(). Функция ord() в PHP работает только с ASCII.

echo mb_ord('????', 'UTF-8');
echo mb_chr(128512, 'UTF-8');
128512
????

MySQL: ORD() и CHAR()

Функция ORD() возвращает числовой код первого символа строки. Функция CHAR() преобразует числовые коды в строку.

SELECT ORD('A'), CHAR(65);
65, 'A'

C / C++: Приведение типа к int

В языках C и C++ символы по сути являются целыми числами. Для получения кода символа используется обычное приведение типа.

char ch = 'A';
int code = (int)ch;
printf("%d", code);
65

Отличия: В отличие от JavaScript, Python и современный PHP изначально работают с полным диапазоном Unicode. В C/C++ и старых версиях PHP работа ограничена ASCII или зависит от кодировки.

JS charCodeAt function comments

En
CharCodeAt Returns the Unicode value of the character at the specified index in a string