字符编码
编码有两类:一类是Unicode编码,另一类是非Unicode编码。
一、非Unicode编码:
1、ASCII
全称是American Standard Code for Information Interchange,即美国信息互换标准码。由一个byte表示,8位,最高位设置为0,用剩下的7位表示字符,即0~127。ASCII规定了从0~127的每个数字代表的字符。ASCII码是计算机发明之初规定的,只考虑了美国的需求,其他国家的字符编码都以此为基础。
2、ISO 8859-1
又名Latin-1。使用一个字节表示,0~127与ASCII一样128~255规定了不同的含义(一些控制字符),160~255表示一些西欧字符。
3、Windows-1252
ISO 8859-1的升级版,新增了一些欧元符号和其他字符。HTML5规定,如果文件声明的是ISO 8859-1,应该被看作Windows-1252。
4、GB2312
这是中文的第一个标准编码。主要针对简体中文常见字符,包括约7000个汉字。固定使用两个字节表示,最高位都是1,如果是0,则是ASCII字符。在这两个字节中,高位字节范围是0xA1~0xF7,低位字节范围是0xA1~0xFE。
5、GBK
是GB2312的升级版,也是用两个字节表示。GBK新增了14000多个汉字,共计21000个汉字。高位字节范围0x81~0xFE,低位字节范围0x80~0xFE。
6、GB18030
向下兼容GBK,增加了55000多字符,共计76000多个字符。包括少数民族和中日韩统一字符。用两个字符(两个字节最多表示65536个字符)已经表示不了GB18030中的所有字符,GB18030使用变长编码,有的字符是两个字节,有的是四个字节。在两字节编码中和GBK一样。在四字节编码中,第一个字节范围为0x81~0xFE,第二个为0x30~0x39,第三个为0x81~0xFE,第四个为0x30~0x39。解析二进制时,通过第二个字节范围是否不同来区分是两字节表示还是四字节表示。
7、Big5
是针对繁体中文的,主要用于中国台湾、香港等地。两个字节表示,高位字节范围为0x81~0xFE,低位字节范围为0x40~0x7E和0xA1~0xFE。
二、Unicode编码:
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode给所有字符都分配了一个唯一的数字编号,这个编号范围从0x000000~0x10FFFF,包括110多万。这个编号一般写成16进制,在前面加U+。大部分中文编号范围为U+4E00~U+9FFF。Unicode通过UTF-8、UTF-16、UTF-32(Unicode Transformation Format,即Unicode字符集转换格式)将Unicode分配的编号对应到具体的字符。
Little endian和Big endian
如果第一个字节是二进制整数中的最高位,最后一个字节是最低位,那这种字节序就叫“大端”(Big endian),反之叫“小端”(Little endian)。
1、UTF-32
每个字符都用4个字节表示,浪费空间,实际采用较少。有UTF-32LE和UTF-32BE。
2、UTF-16
使用变长字节表示,2个或者四个字节表示。有UTF-16LE和UTF-16BE。
3、UTF-8
使用变长字节表示,使用的字节个数为1~4不等。各个Unicode编号范围对应的二进制格式如下:
编号范围 | 二进制格式 |
---|---|
0x00~0x7E(0~127) | 0xxxxxxx |
0x80~0x7EE(128~2047) | 110xxxxx 10xxxxxx |
0x800~0xFFFF(2048~65535) | 1110xxxx 10xxxxxx 10xxxxxx |
0x10000~0x10FFFF(65535以上) | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
由上表可知,第一个字符开头为0的编码与ASCII一样。其他编号的第一个字节,最高位有几个连续的1,就表示用几个字节表示,而其他字节都以10开头。
和UTF-32/UTF-16不同,UTF-8是兼容ASCII的(ASCII是单字节的),对大部分中文而言,一个中文字符需要用三个字节表示。