早期,由于存储空间宝贵,Unicode使用16位二进制来存储文字。我们将一个16位的二进制编码叫做一个码元(Code Unit)。
后来,由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将某个文字对应的二进制数字叫做码点(Code Point)。 一个码点可以拥有一个码元,也可以拥有两个码元
ES6为了解决这个困扰,为字符串提供了方法:codePointAt,根据字符串码元的位置得到其码点。
同时,ES6为正则表达式添加了一个flag: u,如果添加了该配置,则匹配时,使用码点匹配
'𠮷'.length
//结果为 2 这是因为他使用的查看码元的方式来确定字符的长度,而这个通假字拥有两个码元
'𠮷'.charCodeAt(0)
// 第一个码元55362
'𠮷'.charCodeAt(1)
// 第二个码元57271
'𠮷'.codePointAt(0)
// 第一个码点 134071
'𠮷'.codePointAt(1)
//第二个码点与这个字符串的第二码元一致 57271
判断字符串长度
/**
* 判断字符串char,是32位,还是16位
* @param {*} char
*/
function is32bit(char, i) {
//如果码点大于了16位二进制的最大值,则其是32位的
return char.codePointAt(i) > 0xffff;
}
/**
* 得到一个字符串码点的真实长度
* @param {*} str
*/
function getLengthOfCodePoint(str) {
var len = 0;
for (let i = 0; i < str.length; i++) {
//i在索引码元
if (is32bit(str, i)) {
//当前字符串,在i这个位置,占用了两个码元
i++;
}
len++;
}
return len;
}