计算机在存储传输文件信息(图片,文档,音频,视频等)的过程中,都是使用二进制比特流形式。

  所以要保持文件信息,就需要把文件信息按一定的规则转成二进制的比特流进行存储。

  要查看文件信息,计算机也需要把拿到的文件信息(二进制比特流)按一定的规则转成我们能识别的东西。

  这里所说的规则,即指编码和解码方式。

  当把原始文件转成二进制比特流的编码方式和把二进制比特流转成文件的解码方式不兼容的情况下,就会出现乱码

 

  下面介绍字符集,字符编码。

  字符集:是多个字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

  字符集对应到生活中就是对某种语言的称呼,如英语、日语、汉语等。

  字符集规定了某个字符对应的二进制数值存放方式(编码)和某串二进制数值代表了哪个字符(解码)的转换关系。

 

  那么为什么有很多种不相同的字符集呢?

  就像世界上有不同的语言,不同地区或组织在最初制定字符集的时候,并不会意识到这将会是以后全球普适的准则,或者对于自身利益的考虑,就产生了那么多具有相同效果但又不相互兼容的标准了。

  

  字符编码:是一套法则,使用该法则能够将字符集合中的每个字符与计算机能识别的一个二进制数值进行一一配对。

  

  对于一个字符集来说,要正确编码解码一个字符需要三个关键元素:字库表、字符集、字符编码。

  字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。

  字符集,即用一个编码值code point来表示一个字符在字库中的位置。

 

  每个字符在字库表中都有唯一的序号,为什么不把该唯一序号作为存储内容,却还要把该字符通过字符编码转成另外一种格式呢?  

  这是因为统一字库表的目的是为了能够涵盖世界上所有的字符,但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常低。如果把每个字符都用字库表中的序号来存储的话,每个字符就需要3个字节(这里以Unicode字库为例),这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积是原来的三倍)。于是就出现了UTF-8这样的变长编码。在UTF-8编码中原本只需要一个字节的ASCII字符,仍然只占一个字节。而像中文及日语这样的复杂字符就需要2个到3个字节来存储。

 

  我们平常接触到的字符集有下面几种:

  1.ASCII 字符集

  计算机刚出现的时候,主要在西方国家应用,当时的字符集,ASCII 字符集主要用于显示现代英语和其他西欧语言。

  对应于ASCII编码,用一个字节表示一个字符。

 

  2.GB2312字符集

  中国国家标准总局发布了主要用于表示简体中文的字符集,GB2312字符集

  对应于GB2312编码,用两个字节表示一个字符。

 

  3.GBK字符集

  因为GB2312并不能处理一些罕用字等,又出现了GBK字符集。GBK是从GB2312扩展而来,兼容GB2312。

  对应于GBK编码,用两个字节表示一个字符。

 

  4.BIG5字符集

  台湾的多个组织共同发布了主要用于表示繁体中文的字符集,BIG5字符集

  对应于BIG编码,用两个字节表示一个字符。

 

  5.Unicode字符集

  Unicode 学术学会机构制订的Unicode字符集,收录了多种语言的字符并设定了统一且唯一的二进制码,支持现今世界各种不同语言的书面文本的交换、处理及显示。

  Unicode字符集有多种字符编码方式:UTF-32编码 / UTF-16编码 / UTF-8编码

  UTF-32:每个字符都使用四个字节表示一个字符。

  UTF-16:将0–65535范围内的字符都使用两个字节表示一个字符,65535范围外的字符用其他技巧

  UTF-8:是一种可变长度的字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且与ASCII兼容,用一至四个字节为每个字符进行编码。(中文一般用三个字节进行编码)

 

  (本文是个人关于编码方面的理解与总结,概括并不全面,供大家参考交流~)