字符集和字符编码格式有什么区别和作用?

字符集和字符编码格式有什么区别和作用?为什么码好的代码在别人的电脑上运行会出现乱码?其实主要问题在于计算机存储介质中存放的二进制比特流 。如果字符集和字符编码两者之间的转换规则不统一标准,就会乱码现象 。

字符集和字符编码格式有什么区别和作用?

文章插图
字符集和字符编码格式有什么区别和作用?
【字符集和字符编码格式有什么区别和作用?】在介绍字符集之前,我们先了解下为什么要有字符集 。我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流 。那么在这两者之间的转换规则就需要一个统一的标准,否则把我们的U盘插到别的电脑上,文档就乱码了;小伙伴QQ上传过来的文件,在我们本地打开又乱码了 。
什么是字符集?
在介绍字符集之前,我们先了解下为什么要有字符集 。我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流 。那 么在这两者之间的转换规则就需要一个统一的标准,否则把我们的U盘插到老板的电脑上,文档就乱码了;小伙伴QQ上传过来的文件,在我们本地打开又乱码了 。于是为了实现转换标准,各种字符集标准就出现了 。简单的说字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解 码)的转换关系 。
那么为什么会有那么多字符集标准呢?这个问题实际非常容易回答 。问问自己为什么我们的插头拿到英国就不能用了呢?为什么显示器同时有 DVI,VGA,HDMI,DP这么多接口呢?很多规范和标准在最初制定时并不会意识到这将会是以后全球普适的准则,或者处于组织本身利益就想从本质上区 别于现有标准 。于是,就产生了那么多具有相同效果但又不相互兼容的标准了 。
说了那么多我们来看一个实际例子,下面就是屌这个字在各种编码下的十六进制和二进制编码结果,怎么样有没有一种很屌的感觉?
字符集和字符编码格式有什么区别和作用?

文章插图
什么是字符编码?
字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼 。例如:英语,汉语,日语 。对于一个字符集来说要正确编码转码一个字 符需要三个关键元素:字库表(character repertoire)、编码字符集(coded character set)、字符编码(character encoding form) 。其中字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围 。编码字符集,即用一个编码值 code point来表示一个字符在字库中的位置 。字符编码,将编码字符集和实际存储数值之间的转换关系 。一般来说都会直接将code point的值作为编码后的值直接存储 。例如在ASCII中A在表中排第65位,而编码后A的数值是0100 0001也即十进制的65的二进制转换结果 。
看到这里,可能很多读者都会有和我当初一样的疑问:字库表和编码字符集看来是必不可少的,那既然字库表中的每一个字符都有一个自己的序号,直接把序号作为存储内容就好了 。为什么还要多此一举通过字符编码把序号转换成另外一种存储格式呢?
其实原因也比较容易理解:统一字库表的目的是为了能够涵盖世界上所有的字符,但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常 低 。例如中文地区的程序几乎不会需要日语字符,而一些英语国家甚至简单的ASCII字库表就能满足基本需求 。而如果把每个字符都用字库表中的序号来存储的 话,每个字符就需要3个字节(这里以Unicode字库为例),这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积 是原来的三倍) 。算的直接一些,同样一块硬盘,用ASCII可以存1500篇文章,而用3字节Unicode序号存储只能存500篇 。于是就出现了 UTF-8这样的变长编码 。在UTF-8编码中原本只需要一个字节的ASCII字符,仍然只占一个字节 。而像中文及日语这样的复杂字符就需要2个到3个字 节来存储 。

推荐阅读