- 标准 ASCII
- 扩展 ASCII
- GB2312 编码
- GBK 编码
- GB18030 编码
- Unicode 编码
- UCS-2 字符集
- UCS-4 字符集
- UTF-8 编码
先有字符集,然后对每个字符进行编码,这叫字符编码,不同的编码规则就产生了不同的编码方案。
标准 ASCII标准 ASCII 码也叫基础 ASCII 码,使用 7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。
ASCII 编码是直接将 ASCII 字符集的码位转换成二进制数进行存储。
7 位二进制:0000 0000 ~ 0111 1111 这个范围的二进制数可以表示 128 个字符,最高位没有使用 可见字符:英文字母、数字、标点符号 不可见字符:即控制字符,例如,回车符、换行符等
需要记住的字符 ASCII 编码: 48~57 表示的是数字 65~90 表示的是大写英文字母 97~122 表示的是小写英文字母
扩展 ASCII后 128 个称为扩展 ASCII 码,用来表示128 个特殊符号字符、外来语字母和图形符号,这叫 ASCII 扩展字符集。 1000 0000 ~ 1111 1111 这个范围的二进制数可以用来表示 128 个字符。 标准 ASCII 和扩展 ASCII 总共可以表示 256 个字符,这些字符都用 1 个字节来表示。
GB2312 编码GB2312 字符集采有分区管理的模式,组成 94*94
的方阵,每一行称为一个“区”,每一列称为一个“位”,区号位号的范围均为 01-94
,区号和位号组成的代码称为“区位码”,共计有 8836
个码位。
把每个字符对应的码位转换成二进制数,就是 GB2312 编码。
收集了 7445
个字符,其中汉字 6763
个。
01~09 区收录了除汉字以外的图形字符,共计 682 个字符 10~15 区为空白区,没有使用 16~15 区收录了 3755 个一级汉字(常用汉字),按拼音排序 56~87 区收录了 3008 个二级汉字(非常用汉字),按部首/笔画排序 88~94 区为空白区,没有使用
01~09 区表示非汉字的图形字符,共计 682 个字符: 左上角的编号叫“区号”,如上图的
03
区中的字符“y”的位号是 89
,那么这个“y”的码位就是 0389
。
16~55 区收录了 3755 个一级汉字,按拼音排序: 如上图所示,汉字“饼”的区位码
1793
。
56~87 区收录了 3008 个二级汉字,按部首/笔画排序:
二级汉字都是一些不常用的汉字。 如上图所示,汉字“侃”的码位是
5709
。
如何存储“侃”这个汉字?
计算“侃”这个汉字字符的 GB2312 编码,如下图所示:
根据上图所示的计算结果,0xD9A9
就是“侃”这个汉字的 GB2312 编码,可为什么加上 A0
呢?不知道。
以上可以知道 GB2312
编码是 2
个字节表示一个字符。
在 GB2312 字符集的基础上扩充,得到 GBK 字符集,对应的编码叫 GBK 编码。
GB18030 编码在 GBK 字符集的基础上扩充,增加了很多少数民族的字符,得到 GB18030 字符集,对应的编码叫 GB18030 编码
Unicode 编码Unicode 的学名是"Universal Multiple-Octet Coded Character Set",通用多八位编码字符集,简称为 UCS。
UCS-2 字符集Unicode 早期使用 UCS-2 字符集,使用两个字节表示一个字符,可以表示 65536 个字符。
UCS-4 字符集因为不足以表示全世界的字符,所以升级成了 UCS-4 字符集,使用 4
个字节来表示一个字符,使用 32
位的二进制数来表示字符,可以表示将近 43 亿个字符。
UTF-8(Unicode Transformation Format)是针对 Unicode 的一种可变长度字符编码,它不是一种字符集。
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 的码位(即 Unicode 编码)是 0x0000738B
,转换成二进制码就是 00000000 00000000 01110011 10001011
。
0x0000738B
属于 UTF-8 所划分的第三区间,即三字节模板 1110xxxx 10xxxxxx 10xxxxxx
,00000000 00000000 01110011 10001011
从后面往前面逐个替代模板中的 x
,得到 11100111 10001110 10001011
,再把这个二进制编码转换成十六进制编码得到 0xe78e8b
,而这个就是汉字“王”的 UTF-8 编码了。