【计算机导论常识】常见字符编码
写课设的时候发现C语言不支持UTF-8,所以去补充了一下字符编码的知识
字符编码:对字符集进行编码
ASCII码
美国信息交换标准码
为了在不同计算机硬件和软件系统中实现数据传输的标准化
ASCII码字符集共有128个字符,用字节存储,最高位通常为0,可用于数据奇偶校验,其余7位编码
扩展ASCII码
电脑在一些欧洲国家发展后发现标准的ASCII码不够用,所以决定把字符集扩展到8位。最多表示256字符
GB2312 字符集
电脑在中国传播后发现扩展ASCII码也不够用,这时候我们首先要设计新的字符集。
分区管理:94个区,每个区94个位,共计8836个码位
01-09区:除了汉字以外682个字符
10-15区:为空白区
16-55区:3755个一级汉字,按拼音排序
56-87区:3008个二级汉字,按部首/笔画排序
88-94区:空白区
分区后我们可以得到一个字符的区位码
区位码=区字节+位字节
“啊”字是GB2312之中的第一个汉字,它的区位码就是16 01。
但是这还不是GB2312码。为了区分ASCII码,我们需要把区字节和位字节转为16进制后分别加上0xA0
0xB0=0xA0+16,0xA1=0xA0+1
所以啊的GB2312码是0xB0A1
具体为啥加的是0xA0,可以看一下这篇回答
GB2312的扩展
GBK新增20000个汉字和符号
GB18030新增几千少数民族的汉字和符号
Unicode
试图涵盖全球各国字符,先后推出了UCS-2字符集和UCS-4字符集
UCS-2:0x0000~0xFFFF 可以表示65536个字符
UCS-4: 0x00000000~0xFFFFFFFF 可以表示将近43亿个字符,基本足够了
但是有个缺陷就是占用空间太大了
下面主要介绍UTF-8编码规则
每次传输8位数据,是可变长的字符编码。UTF-8将UCS-4划分为4个区间
范围 | 格式 |
---|---|
0x0000 0000~0x0000 007F | 0xxxxxxx |
0x0000 0080~0x0000 07FF | 110xxxxx 10xxxxxx |
0x0000 0800~0x0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0x0001 0000~0x0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
以“王”例子,按表格从上到下将它的UCS-4转化为UTF-8
编码形式 | 具体表示 |
---|---|
UCS-4 | 0x0000 738B |
UCS-4二进制 | 0000 0000 0000 0000 0111 0011 1000 1011 |
第3区间格式 | 1110xxxx 10xxxxxx 10xxxxxx |
UTF-8二进制 | 11100111 10001110 10001011 |
UTF-8十六进制 | 0xE7 0x8E 0x8b |
这个编码方法的好处之一是,码点范围 U+0000 ~ U+007F 编码为一个字节,与 ASCII 编码兼容。这范围的 Unicode 码点也是和 ASCII 字符相同的。因此,一个 ASCII 文本也是一个 UTF-8 文本。