codePointAt和charCodeAt之间的区别

Sta*_*rov 19 javascript string codepoint

String.prototype.codePointAt()String.prototype.charCodeAt()JavaScript有什么区别?

'A'.codePointAt(); // 65
'A'.charCodeAt();  // 65
Run Code Online (Sandbox Code Playgroud)

Tox*_*kes 25

来自Mozilla:

charCodeAt()方法返回一个0到65535之间的整数,表示给定索引处的UTF-16代码单元(UTF-16代码单元匹配单个UTF-16代码单元中可表示的代码点的Unicode代码点,但可能也是代理点对的第一个代码单元,用于在单个UTF-16代码单元中无法表示的代码点,例如Unicode代码点> 0x10000).如果需要整个代码点值,请使用codePointAt().

charCodeAt()是UTF-16,codePointAt()是Unicode.

  • 补充一点,许多Unicode 表显示十六进制值,例如U+00A0。由于 `codePointAt` 返回一个 int,如果您手动查找 unicode 表,您可能希望通过调用 `.toString(16)` 将其转换为十六进制。 (3认同)

Pag*_*eYe 19

要为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"
Run Code Online (Sandbox Code Playgroud)

以下是有关javascript字符串文字的信息:

"\ uXXXX"
由四个十六进制数字XXXX指定的Unicode字符.例如,\ u00A9是版权符号的Unicode序列.

"\ u {XXXXX}"
Unicode代码点
转义.例如,\ u {2F804}与简单的Unicode转义符\ uD87E\uDC04相同.

另见msdn

  • 我认为这是因为它仍然按 16 位索引。所以索引是由`String.prototype.charAt`和`String.prototype.charCodeAt`解释的同一个索引。[如果指定位置没有元素,则返回undefined。如果 pos 处没有 UTF-16 代理对,则返回 pos 处的代码单元。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt#Description )。所以在索引 1,第 16 位,在索引范围 [1,2] 没有 [代理对](https://en.wikipedia.org/wiki/UTF-16#Examples) 所以它变成了损坏的字符 "\ udfb7" (" ") (4认同)
  • 很好的例子,正是我想要的!有两个问题:(i)您知道吗,如果`codePointAt(0)`捕获了“整个”代码点,为什么`codePointAt(1)`返回一个值?(ii)您是否知道“ toLowerCase()”和“ toLocaleLowercase()”在这里的适合度?答案中的字符集是否具有小写/大写字母? (2认同)