字符集:为每个字符定义一个编号(通常用二进制表示);
字符编码:规定了如何将一个字符所对应的编号 存储到计算机的过程,如果使用了类似 GB2312 和 GBK 的变长存储方案(不同的字符占用的字节数不一样),那么为了区分一个字符到底使用了几个字节,就不能将字符的编号直接存储到计算机中,字符编号在存储之前必须要经过转换,在读取时还要再逆向转换一次,这套转换方案就叫做字符编码。
有的字符集在制定时就考虑到了编码的问题,是和编码结合在一起的,例如 ASCII、GB2312、GBK、BIG5 等,所以无论称作字符集还是字符编码都无所谓,也不好区分两者的概念。而有的字符集只管制定字符的编号,至于怎么存储,那是字符编码的事情,Unicode 就是一个典型的例子,它只是定义了全球文字的唯一编号,我们还需要 UTF-8、UTF-16、UTF-32 这几种编码方案将 Unicode 存储到计算机中。
字符集 | 字符编码 | 备注 |
ASCII | ASCII | |
GBK | GBK | |
GB2312 | GB2312 | |
Unicode | UTF-8 | 一种变长的编码方案,使用 1~6 个字节来存储 |
UTF-32 | 一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储; | |
UTF-16 | 介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。 |