44

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

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

4 回答 4

44

从 MDN 页面上charCodeAt

charCodeAt()方法返回一个整数065535表示给定索引处的 UTF-16 代码单元。

UTF-16 代码单元与可以在单个 UTF-16 代码单元中表示的代码点的 Unicode 代码点匹配。如果 Unicode 代码点不能用单个 UTF-16 代码单元表示(因为它的值大于0xFFFF),则返回的代码单元将是代码点代理对的第一部分。如果您想要整个代码点值,请使用codePointAt().

TLDR;

  • charCodeAt()UTF-16
  • codePointAt()Unicode
于 2016-04-10T08:48:10.480 回答
33

要为 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"
由四个十六进制数字 XXXX 指定的 Unicode 字符。例如,\u00A9 是版权符号的 Unicode 序列。

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

参见msdn

于 2017-04-10T16:16:41.713 回答
0

JS 中的示例

在带有字符串和表情符号的示例中,我将说明当您不知道某些字符可能由 2 个代码单元组成时,事情会如何出错。一些字符占用一个以上的代码单元。如果您确定您的角色位于和( 2 16 )之间,请考虑使用codePointAt()over或使用第一个charCodeAt()065535

更多关于代码单元的信息

// charCodeAt() is UTF-16
// codePointAt() is Unicode

/* UTF-16 is generally considered a bad idea today */

const strings = ["o", "four", "to"];
const emojis = ["", ""];

function printItemsLength(arr) {
    for (const item of arr) {
    console.log(item, item.length);
  }
}

printItemsLength(strings);
console.log('================================');
printItemsLength(emojis);
console.log('================================');
console.log("i.charCodeAt(0)", "i".charCodeAt(0)); // 105
console.log("i.charCodeAt(1)", "i".charCodeAt(1)); // 105
console.log("i.codePointAt(0)", "i".codePointAt(0)); // 105
console.log('=============EMOJIS=============');
// getting the decimal (dec) by which you can find them

console.log('===========charCodeAt===========');
// "surrogate pair"
console.log(emojis[0] + '.charCodeAt(0)', emojis[0].charCodeAt(0)); // only half-character - 55357
console.log(emojis[0] + '.charCodeAt(1)', emojis[0].charCodeAt(1)); // only half-character - 55357

console.log('===========codePointAt===========');
console.log(emojis[0] + '.codePointAt(0)', emojis[0].codePointAt(0)); // 128014

console.log('===========charCodeAt===========');
// "surrogate pair"
console.log(emojis[1] + '.charCodeAt(0)', emojis[1].charCodeAt(0)); // only half-character - 55357
console.log(emojis[1] + '.charCodeAt(1)', emojis[1].charCodeAt(1)); // only half-character - 55357

console.log('===========codePointAt===========');
// full-character
console.log(emojis[1] + '.codePointAt(0)', emojis[1].codePointAt(0)); // 128095
console.log(emojis[1] + '.codePointAt(1)', emojis[1].codePointAt(1)); // will return lower surragate (non-displayable character)
// to find this emojis have a look here: https://www.w3schools.com/charsets/ref_emoji.asp

有人可能已经注意到我试图从字符码转换回表情符号,但它不适用于其中一个符号(那是因为它不在 UTF-16 范围内

Unicode 和 UTF-16 简介

如果您已经熟悉它,请跳过此部分

Unicode– 是一组在世界范围内使用的字符;UTF-16- 00000000 00100100 代表“$”(一个 16 位);11011000 01010010 11011111 01100010 代表“”(两个 16 位) 阅读更多

“代理对”字符是表情符号和一些包含超过 1 个字符的字母,如此处所述

术语“代理对”是指在 UTF-16 编码方案中对具有高代码点的 Unicode 字符进行编码的方法。在 Unicode 字符编码中,字符被映射到 0x0 和 0x10FFFF 之间的值。 阅读更多

Unicode- 它为每个字符分配一个唯一的编号,称为代码点

区别于charCodeAt()_codePointAt()

charCodeAt(pos)返回代码一个代码单元(不是一个完整的字符)。

如果您需要一个字符(可以是一个或两个代码单元),您可以使用codePointAt(pos)它来获取它的代码。

charCodeAt()- 返回一个介于 0 和 65535 之间的整数,表示给定索引链接 处的 UTF-16 代码单元codePointAt()- 返回一个非负整数,它是给定位置链接处的 Unicode 代码点值

pos您要检查的字符的索引在哪里。书中引用:

今天,UTF-16 通常被认为是一个坏主意。它似乎几乎是故意设计来招致错误的。编写假装代码单元和字符是相同事物的程序很容易。

阅读更多

jsfiddle 沙箱 来源

  1. 什么是 Unicode、UTF-8、UTF-16?
  2. Marijn Haverbeke Eloquent JavaScript,第 3 版:现代编程简介[文本] – 城市(未指定):无淀粉出版社,2018 – 447 页。可以在这里找到
  3. 什么是“代理对”
  4. 要查找此表情符号,请查看w3schools.com/charsets/ref_emoji

第 5 章,第 91 =>Strings and character codes

于 2022-02-09T00:58:40.430 回答
-2

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

从这个 url,你可以得到不同之处,它们的功能几乎相同,但在返回和非法参数上有些不同

于 2016-04-10T08:56:08.463 回答