字符集
字符集定义了二进制和字符间的对应关系,为每个字符分配了唯一的编号,可以理解成一个很大的表格列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程。
我们平常在称呼ASCll,unicode,时候,经常称呼他们ASCll码,unicode编码,用GBK编码,但是严格意义上来说,ASCll,unicode,GBK是字符集,是把计算机中的0101 0101 与 “abc、汉字,其他文字” 一一对应起来的一套字符集。
ASCll是美国那边发明的一套字符集,采用一个字节来存储英文字母,阿拉伯数字等,0000 0000后七位存储2^7 = 128 个字符,这样我们收到一个8位二进制数据就可以通过ASCll表中查出对应的字母。
但是每个国家的语言文字不同,一个字节的后七位,肯定不够存储,所以就有了每个国家不同的字符集对照表,例如中国的GBK字符集,采用两个字节来存储汉字,如 “字” ,在计算机二进制数据就是0000 0000 0000 0000 这种形式。很多地方称呼GBK编码也是没有不对,因为GBK和ASCll等一些字符集在创造的时候就考虑了编码,很难区分两者的概念。
后来为了统一各国之间的字符集,创造了unicode字符集,又称之为万国码。
编码方案
上面的GBK,ASCll,Unicode只是给字符定义了编号,二进制数据就相当于他们的编号。
我们还需要UTF8,UTF16,UTF32 等编码方案Unicode
字符存储到计算机中。上面的三种编码方案就是Unicode的编码方案
- UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。
- UTF-8,一种可以变长变短的编码方案,使用1-6个字节存储。
- UTF-32, 一种固定长度的编码方案,不管字符编号大小,始终使用4个字节来存储。
- UTF-16,介于上面两种编码方案之间,采用2个或者4个字节,长度既固定又可变。
UTF-8编码规则:
看最高字节,有几个1就用几个字节来编码。如果是0则用一个字节存储。
- 0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 - - 是兼容 ASCII 的;
- 110xxxxx 10xxxxxx:双字节编码形式(第一个字节有两个连续的 1);
- 1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式(第一个字节有三个连续的 1);
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式(第一个字节有四个连续的 1)。
对于常用字符,它的Unicode编号范围0~FFFF,1~3个字节存储,只有少数地区使用的字符才需要4~6个字节存储。
UTF-32编码规则
UTF-32是固定长度的编码,始终占用4个字节,足以容纳所有的Unicode字符,所以直接存储Unicode编号即可。浪费了空间,提高了效率。
UTF-16编码规则
对于Unicode编号范围在0~FFFF之间的字符,UTF-16使用两个字节存储,并且直接存储Unicode编号,不用进行编码转换,这和UTF-32非常类似。
以上三种编码只有UTF-8兼容ASCll,UTF-32和UTF-16都不兼容ASCll,因为它们没有单子节编码。