码字仓颉

计算机字符编码及JavaScript编码方式

2017-03-31

一、 计算机存储

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支持,基本解决了上述问题;

参考:

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章