es6-4 字符串扩展

怎么处理字符已经超过了 0xFFFF 的字符

{
    console.log('a', `\u0061`); // a a
    // 当大于两个字符
    console.log('s', `\u20BB7`); // s ₻7 这个字符已经超过了 0xFFFF
    console.log('s', `\u{20BB7}`); // s 𠮷
}
es5 中 charAt() charCodeAt() 对 Unicode 编码的处理是不到位的
{
    let s = '𠮷'
    console.log('length', s.length); // 2 这个字符的码节是的大于两个字符的, 处理的时候是4个字节, 每两个字节表示一个长度所以是2
    
    // 取弟一个字符
    console.log('0', s.charAt(0)); // 乱码
    // 取弟二个字符
    console.log('1', s.charAt(1)); // 乱码
    // 取第一个字符的 Unicode 编码的码值
    console.log('at0', s.charCodeAt(0)); // 55362
    // 取第二个字符的 Unicode 编码的码值
    console.log('at1', s.charCodeAt(1)); // 57271
}
es6 中 codePointAt() codePointAt() 对 Unicode 编码的处理
{
    let s = '𠮷a'
    console.log('length', s.length); // 3
    console.log('code1', s.codePointAt(0)); // 134071 十进制
    console.log('code0', s.codePointAt(0).toString(16)); // 20bb7 十六进制
    console.log('code1', s.codePointAt(1)); // 57271 取的是后两个字节
    console.log('code1', s.codePointAt(2)); // 97 表示 a

    // es5 中的 fromCharCode() 处理 Unicode 字符
    console.log(String.fromCharCode('0x20bb7')); // 乱码
    // es6 中的 fromCodePoint() 处理 Unicode 字符
    console.log(String.fromCodePoint('0x20bb7')); // 𠮷
}
字符串遍历大于 0xfff 编码 es5 es6 处理对比
{
    // es5 中 字符串的遍历
    let str = '\u{20bb7}abc';
    for (let i = 0; i < str.length; i++) {
        console.log('es5', str[i]); // 乱码 乱码 a b c
    }

    // es6 中 字符串的遍历
    for (let code of str) {
        console.log('es6', code); // 𠮷 a b c
    }
}

 

posted @ 2019-11-07 15:11  Helzeo  阅读(121)  评论(0)    收藏  举报