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

В чем разница между String.prototype.codePointAt() и String.prototype.charCodeAt() в JavaScript?

'A'.codePointAt(); // 65
'A'.charCodeAt();  // 65

person Stanislav Mayorov    schedule 10.04.2016    source источник
comment
MDN: charCodeAt — первый абзац .   -  person Emissary    schedule 10.04.2016


Ответы (3)


Из Mozilla:

Метод charCodeAt() возвращает целое число от 0 до 65535, представляющее кодовую единицу UTF-16 с заданным индексом (кодовая единица UTF-16 соответствует кодовой точке Unicode для кодовых точек, представленных в одной кодовой единице UTF-16, но может также быть первой кодовой единицей суррогатной пары для кодовых точек, которые не могут быть представлены в одной кодовой единице UTF-16, например, кодовые точки Unicode> 0x10000). Если вам нужно полное значение кодовой точки, используйте codePointAt().

charCodeAt() — это UTF-16, codePointAt() — это Unicode.

person ToxicTeacakes    schedule 10.04.2016
comment
Просто чтобы добавить, многие таблицы Unicode показывают шестнадцатеричные значения, например. U+00A0. Поскольку codePointAt возвращает целое число, вы можете преобразовать его в шестнадцатеричный, вызвав .toString(16), если вы ищете таблицу Unicode вручную. - person Kevin Lee; 20.07.2017

Чтобы добавить несколько ответов ToxicTeacakes, вот еще один пример, который поможет вам понять разницу:

"????".charCodeAt(0).toString(16);//d842
"????".charCodeAt(1).toString(16);//dfb7

"????".codePointAt(0);//20bb7
"????".codePointAt(1);//dfb7

console.log("\ud842\udfb7");//????, an example of hexadecimal digits
console.log("\u20bb7\udfb7");//₻7�
console.log("\u{20bb7}");//???? an unicode code point escapes the "\ud842\udfb7"

Ниже представлена ​​информация о строковых литералах javascript. :

\uXXXX
Символ Unicode, определяемый четырьмя шестнадцатеричными цифрами XXXX. Например, © — это последовательность Unicode для символа авторского права.

\u{XXXXX}
кодовая точка Unicode
экранирует. Например, \u{2F804} совпадает с простым escape-символом Unicode ������.

см. также msdn

person PageYe    schedule 10.04.2017
comment
Отличный пример, как раз то, что я искал! Пара вопросов: (i) Знаете ли вы, почему codePointAt(1) возвращает значение, если codePointAt(0) захватывает всю кодовую точку? (ii) Вы знаете, как здесь подходит toLowerCase() против toLocaleLowercase()? Имеют ли наборы символов, подобные тому, что в вашем ответе, даже нижний/верхний регистр? - person Dmitry Minkovsky; 04.12.2017
comment
Я думаю, это потому, что он все еще индексируется 16 битами. Таким образом, индекс — это тот же индекс, который интерпретируется String.prototype.charAt и String.prototype.charCodeAt. Если в указанном месте нет элемента позиция, возвращается undefined. Если суррогатная пара UTF-16 не начинается с позиции pos, возвращается единица кода с позиции pos.. Таким образом, в индексе 1, 16-й бит, нет суррогатной пары в диапазоне индексов [1,2], поэтому он становится сломанным символом ��� (�) - person dosentmatter; 21.12.2017

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt

из этого URL-адреса вы можете получить различия, их функции почти одинаковы, но есть некоторые различия в возврате и недопустимом аргументе.

person Allen    schedule 10.04.2016