早期,由于存储空间宝贵,Unicode使用16位二进制来存储文字。我们将一个16位的二进制编码叫做一个码元(Code Unit)。

    后来,由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将某个文字对应的二进制数字叫做码点(Code Point)。 一个码点可以拥有一个码元,也可以拥有两个码元

    ES6为了解决这个困扰,为字符串提供了方法:codePointAt,根据字符串码元的位置得到其码点。

    同时,ES6为正则表达式添加了一个flag: u,如果添加了该配置,则匹配时,使用码点匹配

    1. '𠮷'.length
    2. //结果为 2 这是因为他使用的查看码元的方式来确定字符的长度,而这个通假字拥有两个码元
    3. '𠮷'.charCodeAt(0)
    4. // 第一个码元55362
    5. '𠮷'.charCodeAt(1)
    6. // 第二个码元57271
    7. '𠮷'.codePointAt(0)
    8. // 第一个码点 134071
    9. '𠮷'.codePointAt(1)
    10. //第二个码点与这个字符串的第二码元一致 57271

    判断字符串长度

    1. /**
    2. * 判断字符串char,是32位,还是16位
    3. * @param {*} char
    4. */
    5. function is32bit(char, i) {
    6. //如果码点大于了16位二进制的最大值,则其是32位的
    7. return char.codePointAt(i) > 0xffff;
    8. }
    9. /**
    10. * 得到一个字符串码点的真实长度
    11. * @param {*} str
    12. */
    13. function getLengthOfCodePoint(str) {
    14. var len = 0;
    15. for (let i = 0; i < str.length; i++) {
    16. //i在索引码元
    17. if (is32bit(str, i)) {
    18. //当前字符串,在i这个位置,占用了两个码元
    19. i++;
    20. }
    21. len++;
    22. }
    23. return len;
    24. }