早期,由于存储空间宝贵,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;}
