一、定义
字符集是一批字符的集合,每个字符对应一个特殊的字符编号,计算机要存储字符,需要通过字符集找到字符编号,并转化为二进制数据存储在内存中。常用的字符集有ASCII 字符集和Unicode字符集。
二、数据的解码和存储过程
字符的存储大致分为俩步,第一是将字符通过特定的字符集转化为字符编号,第二是将字符编号转化为二进制写入内存,解码正好是一个逆过程,从二进制数据转化为编号再转为字符最终显示在屏幕上。
解码的过程中就抛出了一个问题比如有下面一段二进制数据'11001111100101110111001110001'我们如何断词?这段数字代表几个字符?
针对这个问题,主流的有俩种方法处理:
定长处理:
比如ASCII采用一个字节,也就是8bit的长度代表一个字符,
这种方法的缺点是,8位二进制,最多只能容纳个字符
特殊标记处理:
比如utf-8等,在这里需要明确一点,计算机的最小存储单位是bit,一个字节等于8bit,计算机读取一个完整字节的速度最快,所以在存储和解码的过程中都是以B位最小单位的。因此这种解码方法一般是以从最高位开始有几个连续的1来标记第一个字符的二进制编码占用了几个字节的数据。
三、ASCII 字符集
ASCII 总共包含 128 个字符,主要包括英文字母,阿拉伯数字,和一些符号,用 7 个比特位(Bit)恰好能够存储,不过考虑到计算机一般把字节(Byte)作为基本单元,为了操作方便,我们不妨用一个字节(也就是 8 个比特位)来存储 ASCII。这样虽然浪费了一个比特位,但是读写效率提高了。
四、Unicode字符集
Unicode 为了兼容 ASCII,在设计时刻意保留了原来 ASCII 中字符的编号,所以英文字母和阿拉伯数字在 Unicode 中的编号都非常小,用一个字节足以容纳。中是一个汉字,编号比较大,一般要用两个字节才能容纳。
unicode不能单独使用需要配合utf才能正常使用,这是因为,unicode仅仅定义了字符与其对应的字符编号,对于如何断词并没有规定在内,而utf正是用来处理这一部分的,他在unicode的基础上建立一个unicode编号与utf编号的映射关系,而utf编号是一组以特殊标记开头的编号,因此unicode+任意一种utf便可完成字符的存储与二进制数据的解码。
unicode有三种编码方式,utf-8 utf-16 utf-32,后俩种不常用,这里只介绍下utf-8
utf-8
UTF-8 的编码规则很简单:如果只有一个字节,那么最高的比特位为 0;如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
具体的表现形式为:
0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的;
110xxxxx 10xxxxxx:双字节编码形式;
1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式;
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式。
xxx 就用来存储 Unicode 中的字符编号,不足8位的需要进行补0。
字符 | unicode(16) | unicode(2) | utf-8 | utf-8(2) |
---|---|---|---|---|
中 | u4e2d | 1001110 00101101 | 中 |
*黑色代表几个字节
*蓝色补零
*红色unicode编号