字符编码

非Unicode编码

ASCII码

ASCII码首先是为了满足美国使用,大概只需要128个字符,规定了128个字符的二进制表示方法,128刚好用7位表示,计算机最小的单位byte是8位,ASCII码中首位置0,剩下7位表示字符。

0~127中32~126表示的都是可打印字符,包含了大多数常用字符,0~31和127表示的不可打印字符,一般用于控制目的。

ISO 8859-1(了解)

又称Latin-1,使用一个字节表示一个字符,其中0~127一样,128~159表示一些控制字符,160~255表示一些西欧字符。

Windows-1252

ISO 8859-1虽然是为西欧国家制定的,但是标准早于欧元导致连欧元符号€都没有,Windows-1252基本代替他,在很多应用中即使声明采用ISO编码,解析的时候却依然会当作Window解析。

区别:Windows在ISO的基础上,在128~159直接使用了一些可打印字符。

GB2312

GB2312是第一个中文标准,采用两个字节表示一个汉字,其中最高位都是1,如果是0就认为是ASCII码。两个字节中高位0xA1~0xF7,低位是0xA1~0xFe,能表示约7000个汉字和一些罕用词和繁体字。

GBK

GBK建立在GB2312基础上,向下兼容GB2312。GBK增加了14000多汉字,共计约21000个汉字。同样使用两个字节表示,其中高位字节范围0x81~0xFE,低位字节范围0x40~0x7E和0x80~0xFE。

注意:低位字节是从0x40开始的,说明低位字节的最高位可能是0,哪如何区分是汉字还是ASCII码?

答:汉字是由两个字节表示,在解析的时候,只要第一个字节最高位是1,那么就将下一个字节连起来解析成一个汉字,而不用考虑他的最高位,解析完后跳到第三个字节继续解析。

GB18030

GB18030向下兼容GBK,新增55000字符,共76000个字符,包括少数民族字符,以及中日韩统一字符。GB18030中有的是两个字符,有的是四个字符。两个字符的表示和GBK一样,四个字符中第二个字节从0x30~0x39,以此区分是两个字节表示还是4个字节表示一个字符。

Big5

Big5针对繁体中文,规范应用于中国台湾和香港等地区,包括13000多繁体字,使用两个字节表示。

Unicode编码

Unicode编码给世界上所有字符分配了一个唯一的数字编号,从0x000000~0x10FFFF,包括110万,但大多数常用字符都在0x0000~0xFFF之间,他并没有规定每个字符怎么对应到二进制上,讲编码对应到二进制上,讲交给UTF-32、UTF-16、UTF-8来完成。

UTF-32用四个字节表示一个字符,不对应ASCII码。

UTF-16大部分用两个字节表示,少部分用4个字节表示,不对应ASCII码。

UTF-8用3个字节表示汉字,1个字节表示英文,对应ASCII码