第一阶段 盘古开天辟地 --ASCII 码
计算机大家都知道, 本质是二进制运算和存储. 在计算机中人类的几乎所有文字和字符都没法直接表示, 所以美国人在发明计算机的时候为了让计算机可以用于保存和传输文字, 就发明了 ASCII 码 (American Standard Code for Information Interchange, 美国信息交换标准代码), 用 128 个数字分别映射到美国人常用的一些字符, 一个字符只占用一个字节. 这样一来就满足了美国人的交流需要.
第二阶段 军阀混战之战国七雄 --GBK
但是计算机这东西真的是太好用了, 只在美国使用有点暴殄天物, 其他国家为了能让计算机在自己国家也好用, 就发明了自己的编码系统来适配自己国家的文字和字符, 比如西欧国家的 Windows-1252 和中国的 GBK 以及港澳台地区用得比较多的 Big5.
因为 ASCII 只有 128 个, 用二进制 7 位就够了, 而计算机的最小存储单位 byte 是 8 位, 所以 ASCII 码中每个字节的最高位永远是 0, 因此这些国家在搞自己的编码的时候很容易地就保持了对 ASCII 的兼容, 即当每个字节最低位为 0 的时候表示 ASCII 码, 为 1 的时候表示自己国家的编码.
以中文 GBK 为例, GBK 使用固定的两个字节, 当解析到的字节最高位为 0 时, 只解析当前字节作为 ASCII 码, 当最高位为 1 的时候, 就将下一个字节读进来一起解析为一个汉字, 而不用考虑第二个字节的最高位, 然后跳到第三个字节继续解析, 往复如此直到解析完成.
其他国家和地区的编码系统也大致如此.
第三阶段 秦王扫六合之书同文 --Unicode
现在问题来了, 每个国家在设计自己国家的编码的时候基本上都只考虑了自己国家的需求, 导致不同国家之间的编码互不兼容, 这给不同国家之间的交流造成了很大的阻碍和困扰.
这时候就需要有人来干秦始皇干活的 "车同轨, 书同文" 的事了, 于是就出现了 Unicode.Unicode 为世界上所有字符设定了统一并且唯一的数字序号, 这个编号范围从 0x000000 到 0x10FFFF, 包括 110 多万. 也就是说, 世界上所有国家的文字和字符都能在 Unicode 中找到唯一的序号, 这样一来大家就有统一的标准.
第四阶段 小篆到简体中文 --UTF-8
但是, Unicode 只规定了编号, 没有规定编号到二进制的映射方式.
我们先做最简单的设想: 在计算机中使用固定数量的字节来存储 Unicode, 即直接存储所有的字符编号的二进制编码. 但这样的话对于编号比较小的那些字符来讲高位全都是 0, 非常浪费空间, 再考虑到最常用的字符编号都比较小, 这么做的话对于网络传输速度和存储空间都是极大的浪费, 所以我们需要一种变长的 Unicode 映射方式, 于是就出现了 UTF-8.
UTF-8 就是使用变长字节表示, 每个字符使用的字节个数与其 Unicode 编号的大小有关, 编号小的使用的字节就少, 编号大的使用的字节就多, 使用的字节个数从 1 到 4 个不等. 这样一来存储同样多的信息需要的内存空间就便少了很多, 在网络通信中获取信息的效率也会提升很多.
UTF-8 的优势如此明显, 所以它很快就席卷了全球, 成为了大家最常用的编码.
一点补充:
UTF-8 编码中, 大多数中文占用的字节数是 3 个, 相较于 GBK 的 2 个, 多出了 1/3, 这也就意味着在存储纯中文文档的时候, UTF-8 编码的文件占用空间是 GBK 编码文件的 1.5 倍.
基于上面这项特性, GBK 在很多纯中文系统中还是有很大的应用市场. 其目的呢, 就是为了节省用户的硬盘和流量
来源: https://www.cnblogs.com/JackPn/p/9382663.html