天天看点

谈谈字符编码字符集

什么是字符集?

集,即集合的意思,字符集字面上的意思就是字符的集合,本意也是如此,字符集就是某类字符的集合,比如说:对于英语国家使用的二十六个字符,我们将其命名为一个字符集,即ASCII。还有欧洲国家使用的ISO8859,以及以表现多国语言为目标的Unicode。

什么是字符编码?

对于某一个字符集中的字符,人们对于每个字符给予一个数字编码进行表式,但是众口难调,字符编码也难调,同一个字符集,不同的人也会用不同的方式去表达,这样同一个字符集就有了多种编码,如:utf-8,utf-16等都是对于unicode字符集的不同编码方式。

为什么有字符集和字符编码这些东西?

因为计算机最开始是为了计算而设计的,理所当然的,计算机表达数字会更为方便一些,后来纯粹的数 字计算越来越少,计算机需要处理人类的文字语言,于是我们需要一种方法将数字映射为人类的文字,这种映射关系就是对字符进行编码。

起初,计算机是在英语国家发展起来的,这些国家的语言是由26个英文字母组合而成,我们给这二十六个英文字符的大小写以及其他一些特殊字符一共是128个字符,分别映射到一个数字上面,于是我们可以用7位二进制来表示这每一个字符,这种方式我们称之为ASCII码,而对于通信单位字来说,每个字包含八个字节,于是我们还多了一位用于错误码检测。

谈谈字符编码字符集

对于非英语国家而言,语言可能就复杂了,就咱们中国的汉字来说,常用的就有好几千个,8位二进制远远无法表达这些信息,而且每个国家都定义了自己的一套编码规则,结果世界上充满了各种文字编码,如果软件只限于一国一语言来说没有大碍,但是如果需要支持多语言的时候就会出问题了。为了解决这个问题,在苹果,微软等公司主导下定义了一种意图涵盖世界上所有文字的编码体系Unicode。起初的Unicode设计是打算利用两个字节长度即16位二进制(65535个字符)来涵盖所有的字符,当时可能这些就够了,但是随着语言的发展,越来越多的字符被加进来了,不能囊括在16个字符的范围内,最新的unicode规范是unicode6.3,涵盖了超过十万个字符的巨大集合。

我们平常说的utf-8, utf-16,utf-32就是对于unicode这个字符集的编码方式。

utf-8是采用一种变长的编码方式,与已有的ASCII字符集编码兼容。对于前八位字符其编码方式与ASCII编码一样,因此即使是将ASCII当做utf-8编码也不会有问题。

下图是utf-8的字节组合

1.除了第一个字节是0开头,其他的字节都是10开头

2.可以根据第一个字节知知道之后还有几个字节

谈谈字符编码字符集

utf16采用定长的16位来表示一个字符,如此只能表示65535个字符,对于超过16为字长的字符,用两个16位码的组合来表示。

utf-32就是采用定长32位来表示一个字符,缺点是浪费内存空间。

我们的程序中为什么会有乱码出现呢?

如果世界上只有unicode这么一个大集合,且值规定了utf-8这么一种编码方式,那么世界太平,计算机中的所有存储都按这种方式去编码以及解码信息,那么也就没有所谓的乱码,当使用了utf-8方式去编码,而采用utf-16方式去解码的时候,乱码就发生了。所以对于乱码我们要搞清楚输入信息是用的什么编码方式,然后用对应的方式去解码。

继续阅读