0

Разница между codePointAt и charCodeAt

14

Заголовок: Разница между 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 ответ(ов)

0

Объяснение 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь