String.prototype.codePointAt()
JavaScript和JavaScript有什么区别String.prototype.charCodeAt()
?
'A'.codePointAt(); // 65
'A'.charCodeAt(); // 65
String.prototype.codePointAt()
JavaScript和JavaScript有什么区别String.prototype.charCodeAt()
?
'A'.codePointAt(); // 65
'A'.charCodeAt(); // 65
从 MDN 页面上charCodeAt
:
该
charCodeAt()
方法返回一个整数0
,65535
表示给定索引处的 UTF-16 代码单元。UTF-16 代码单元与可以在单个 UTF-16 代码单元中表示的代码点的 Unicode 代码点匹配。如果 Unicode 代码点不能用单个 UTF-16 代码单元表示(因为它的值大于
0xFFFF
),则返回的代码单元将是代码点代理对的第一部分。如果您想要整个代码点值,请使用codePointAt()
.
charCodeAt()
是UTF-16codePointAt()
是Unicode。要为 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
在带有字符串和表情符号的示例中,我将说明当您不知道某些字符可能由 2 个代码单元组成时,事情会如何出错。一些字符占用一个以上的代码单元。如果您确定您的角色位于和( 2 16 )之间,请考虑使用codePointAt()
over或使用第一个charCodeAt()
0
65535
// 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
- 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 沙箱 来源:
第 5 章,第 91 =>Strings and character codes
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt
从这个 url,你可以得到不同之处,它们的功能几乎相同,但在返回和非法参数上有些不同