字符编码

编码有两类:一类是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是单字节的),对大部分中文而言,一个中文字符需要用三个字节表示。

posted @ 2020-02-19 15:17  rookie丶k  阅读(283)  评论(0编辑  收藏  举报