js采用UTF-16来对unicode进行编码,在FFFF及更小的unicode码中,UTF-16编码与unicode码是一模一样的,所以'\uxxxx'直接根据unicode原码表就能查出所需要的字符,无需转换编码。
当unicode码大于FFFF时,utf-16就会引进标志位,用四个字节表示unicode编码,此时UTF-16编码就与我们查到的原unicode码完全不一样了。
而ES6中,可以使用'/u{xxxxx}' 直接根据unicode码,输出对应字符,无需转化成utf-16:
"\u{20BB7}"// "?"
上述字符,在ES6之前,只能通过转换utf-16来输出:
'\uD842\uDFB7'//"?"
补充:
charCodeAt()得到的是utf-16的编码的十进制数,并不是unicode编码,这一点很多文档都写错了
utf-8是可变长的,兼容ascii码,小于等于1字节时等同于unicode码,大于1字节时会有标志位,也就不同于unicode码
附:
编码以16位无符号整数为单位。我们把Unicode 编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx