unicode字符集
unicode
字符集是对世界上绝大部分字符进行编码,一个字符对应一个编码,范围:0x0000-0x10FFFF
,可以表示一百多万个字符,其中0x0000-0xFFFF的字符为BMP
(基本多语言平面字符集),剩余的字符集为补充字符集包括了(许多常见的emoji字符位于此)。
utf-8,utf-16,uft-32编码方式
这些是对unicode
字符集中的字符进行存储传输的编码方式,对于一个unicode
码的二进制值,编码方式会以不同的规则将unicode
码映射成1~4字节
的值。其中
utf-8
:会将unicode码以6位为界切割,编码后的值在1-4字节。
utf-16
:0x0000-0xFFFF
的unicode
字符不用编码,直接存储,大于这个范围的用一个代理对(2个16位,即2个码元)表示,编码后的值为2或4字节
。
utf-32
: 直接用32位4个字节来存储unicode
值,不需要编码。
utf-24不实用,计算机不好处理,性能差,而且节省的空间也不多,所以不编码的方式就用utf-32
JS中的字符串存储方式
js中存储字符的编码方式用的是UTF-16
,因此string.length这里的长度指的是16位码元的长度,比如长度是2,说明这个值存储占用了2个码元,2*16=32位,4个字节。
字符串的其他方法:
- string.length,字符串有多少个码元。
- string.charAt(),第n个码元的unicode的字符。
- string.charCodeAt(n),第n个码元的unicode的值,十进制
- string.charPointAt(n),第n个码点的unicode的值,十进制,字符中如果有补充字符集(超过0xFFFF)的字符,需要用这个来获取对于位置的字符。
当字符中的字符的unicode值在0x0000-0xFFFF时,码点的值就是码元的值,上面的方法都没有差别。大于0xFFFF的unicode字符,如emoji表情,码点的值就不是码元的值了,要注意区别,如下图的emoji表情的length是2.