Разница между codePointAt и charCodeAt
Заголовок: Разница между String.prototype.codePointAt()
и String.prototype.charCodeAt()
в JavaScript
Текст вопроса:
Какова разница между методами <code>String.prototype.codePointAt()</code>
и <code>String.prototype.charCodeAt()</code>
в JavaScript?
Я заметил, что оба метода возвращают одинаковое значение для символа 'A'
, как показано в следующем коде:
'A'.codePointAt(); // 65
'A'.charCodeAt(); // 65
Однако я слышал, что существуют различия между ними. Можете, пожалуйста, объяснить, в чем именно заключается эта разница и в каких случаях следует использовать один метод вместо другого?
1 ответ(ов)
Объяснение codePointAt(index)
в JavaScript
Вопрос о различиях между двумя методами уже был рассмотрен другими участниками. Однако я хотел бы отметить важный нюанс, касающийся использования codePointAt(index)
.
Аргумент index
в codePointAt
использует кодировку UTF-16, которая не всегда соответствует визуальным символам (или кодовым точкам).
Например:
const emojis = "😵💫🎉";
console.log(String.fromCodePoint(emojis.codePointAt(0))); // Корректно выводит 😵💫
console.log(String.fromCodePoint(emojis.codePointAt(1))); // Неудачно, выводит
Это происходит потому, что 😵💫
состоит из двух единиц UTF-16 (суррогатная пара). Индекс 1 получает только вторую часть, которая сама по себе не является допустимым символом.
Чтобы правильно перебирать кодовые точки, используйте итератор строк:
const emojis = "😵💫🎉";
for (const char of emojis) {
console.log(char); // Корректно выводит каждый эмодзи
console.log(char.codePointAt(0)); // Корректно выводит кодовую точку для каждого эмодзи
}
Этот метод также позволяет безопасно получать кодовые точки в определенных позициях:
const emojis = "😵💫🎉";
const codepoint = [...emojis][1].codePointAt(0);
console.log(String.fromCodePoint(codepoint)); // Корректно выводит 🎉
Важно:
emojis[1].codePointAt(0)
не будет работать, как ожидается, потому что он также использует индексацию UTF-16.
Как присвоить многострочную строку переменной?
Преобразование объекта JS в строку JSON
Как преобразовать строку, разделённую запятыми, в массив?
Как заменить символ по заданному индексу в JavaScript?
Удалить первый символ строки, если он равен 0