编码
首先,编码的定义是:信息从一种形式或格式转换为另一种形式的过程。(百度百科)
下面粗略的从两个方面讲下编码的作用:
人和计算机的信息交换:人输入信息的方式有多种,比如说 语音,视频,文字等等,但是计算机只认识二进制,那么问题就来了,如何 翻译 给计算机呢?以 文字 举例,用户输入分为以下阶段:
输入——>汉字键盘码——>汉字交换码——>汉字内部码——>汉字地址码——>汉字字形码——>输出。
下面大概讲下这几个步骤。
键盘码:有两种,一种比如说是鼠标的点击,对应的是操作系统的键值,另一种是转换为ascii码。过程如下:
用户——>输入码/汉字输入码(比如说五笔,拼音等等(也符合编码的概念--))——>键盘——>键盘扫描码——>BIOS键盘驱动程序——>操作系统——>程序消息(这里我有个问题,就是bios传递给操作系统的信息格式是什么样子的,肯定不是ascii码,因为没有田字格的ascii码。估计也有一种格式--)
然后交换码和内部码,就是这次我们讲的重点:字符编码。
这里讲下,交换码,也就是我们所说的编码集。比如说, GB2312全称就是 《信息交换用汉字编码字符集·基本集》,而字符集和编码集,就是为了实现将输入的文字转换为计算机识别的二进制格式:内部码。
下面明确一个概念,字符集 和 编码集。
所谓字符集,是指:一个文字系统所支持的所有抽象字符的集合。
所谓编码集,是指:将字符集转换为计算机可接受的形式的信息,(this is 编码)
比如说unicode是字符集,ascii既是编码集,也是字符集,而utf-8则是编码集。具体大家可以取查下utf-8,GBK,这是用的比较多的两种编码集。
想要深入了解的话,推荐做一个编码识别的程序:随便找一个网页,可以判断其编码。做法大概是 根据每个字节大小判断其编码,再根据全文占比率判断整体编码
最后,汉字地址码和字形码涉及到的是汉字的显示问题,比如点阵显示,矢量显示,实现后就是我们看到的各种字体了。粗略讲下:
用点阵表示字型时,汉字字型码指的是这个汉字字型点阵的代码。根据输出汉字的要求不同,点阵的多少也不同。简易型汉字为16*16点阵,提高型汉字为24*24点阵,32*32点阵,48*48点阵等等,
矢量表示方式存储的是描述汉字字型的轮廓特征,当要输出汉字时,通过计算机的计算,由汉字字型描述生成所需大小和形状的汉字点阵。矢量化字型描述与最终文字显示的大小,分辨率无关,因此可以产生高质量的汉字输出。Windows中使用的TrueType技术就是汉字的矢量表示方式。
(来自百度百科)
此处还有些知识点,比如apple的边缘模糊技术,就不细讲了。有兴趣的同学可以自行了解。估计是图形学方面的知识。留待以后感兴趣了再细看。
计算机和计算机的信息交换:这个就不多讲了,其实就是使用内部码传递信息。
这里有一个坑点,就是早期网关(硬件)采用7bit位传输(这里就有个问题了,如果早期网关是第一个bit位做奇偶校验呢,还是由于网关的某些原因只接受7位数据划分呢)。为了解决这个问题,诞生了后来的base64。有兴趣了解的可以看下链接。
有相关兴趣的同学可以研究下 中文信息处理 这门课,以及可以自己动手做下demo
有一些有意思的问题可以考虑下:
Why 1B==8bit
字符集和编码集区别
用户A输入信息到用户B显示信息的过程。
一些比较有意思的,或者相关的链接:
UTF-8 GBK UTF8 GB2312 之间的区别和关系
WHY IS A BYTE 8 BITS? OR IS IT?