一、 计算机存储
1. 位(bit)
计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态.bit是计算机内存数据存储的最小单位,也称为比特,可简写为b。计算机中的CPU位数指的是CPU一次能处理的最大位数。
2. 字节(byte)
八个二进制位称为一个字节,即 1byte = 8bit,1字节最多可以表示 2^8 = 256 个字符。
3. 字符
计算机中使用的字母、数字、汉字、符号等。在计算机中,采用不同的字符集、不同的编码方式,一个字符占用的存储空间是不同的。
- 在 ASCII 编码中,一个英文字母字符存储需要1个字节;
- 在 GB2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节;
- 在 UTF-8 编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节;
- 在 UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节);
- 在UTF-32编码中,世界上任何字符的存储都需要4个字节。
二、 字符编码
1. ASCII
- American Standard Code for Information Interchange
- 美国字符集,主要用于显示现代英语和其他西欧语言,共128个字符;
- 最通用的单字节编码系统;
- 1字节
2. GB2312、GBK
- GB2312是中国国标字符集,规定了6763个中文、682个拉丁、希腊字母等, 微软在GB基础上拓展出了GBK;
- 2字节
3. Unicode
- 全世界所有的字符集合,目前,Unicode的最新版本是7.0版,一共收入了109449个符号;
- 包含17个平面:
1个基本面(2^16=65536个字符,范围为 U+0000 ~ U+FFFF),16个辅助平面(U+010000 ~ U+10FFFF);
三、编码方法
Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。
1. UTF-32
- 4个字节表示一个字符;
- 与Unicode编码一一对应,比如,字母a为0x00000061;
- Pro:查找效率高,时间复杂度o(1)
- Con:浪费空间,比相同ASCII编码大四倍
2. UTF-8
- 变长编码方法,1~4个字节,越是常用的字符,字节越短,最前面的128个字符,只使用1个字节表示,与ASCII码完全相同;
- 节省存储空间;
- 由于它节省空间的特性,使用最多;
编号范围 | 字节 |
---|---|
0x0000 - 0x007F | 1 |
0x0080 - 0x07FF | 2 |
0x0800 - 0xFFFF | 3 |
0x010000 - 0x1FFFF | 4 |
3. UTF-16
- 变长编码,2或4个字节;
- 基本平面的字符占用2个字节(U+0000 ~ U+FFFF),辅助平面的字符占用4个字节(U+010000 ~ U+10FFFF)
四、JavaScript采用哪种?
- Unicode字符集
- UCS-2编码
- 2个字节,且字符不全;
- JS被发明的时候只有UCS-2,没有UTF;
- 后来UTF-16取代了UCS-2,或者说UCS-2整合进了UTF-16,所以,现在只有UTF-16,没有UCS-2;
- 所以说JS采用的是UTF-16编码方式;
- 带来的问题:
- 由于JavaScript只能处理UCS-2编码,造成所有字符在这门语言中都是2个字节,如果是4个字节的字符,会当作两个双字节的字符处理。JavaScript的字符函数都受到这一点的影响,无法返回正确结果;
- ES6中增强了Unicode支持,基本解决了上述问题;
参考:
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章