java-字符的编码与乱码(1)

编码有两大类:一类是非Unicode编码;另一类是Unicode编码。

1.常见的非Unicode编码

主要的非Unicode编码包括,ASCII 、ISO 8859-1 、Windows-1252、GB2313、GBK、GB18030和Big5.

ASCII 全称是American standard Code for Information Interchange 美国信息交换标准代码。计算机发明之初只考虑了美国的需求。美国大概只需要128哥字符,所以就规定了128个字符的二进制表示方法。这个方法是一个标准,称为ASCII编码。

ISO8859-1 又称Latin-1,它也是使用一个字节表示一个字符,其中0-127与ASCII一样,128-255规定了不同的含义。

Windows-1252 这个编码与ISO 8859-1基本一样,区别只在于数字128-159.这个编码中加入了欧元符号以及一些其他常用的字符。

GB2312 中文的第一个标准。GB2312标准主要针对的是简体中文的常见字符,包括约7000个汉字和一些罕用词和繁体字。

GBK GBK建立在GB2312的基础之上,向下兼容GB2312,也就说GB2312编码的字符和二进制表示,在GBK编码中是完全一样的。GBK增加了14000多个汉字,共计约21000个汉字,其中包括繁体字。

GB18030 向下兼容了GBK,增加了55000多个字符,共76000多个字符,包括了很多少数民族字符,以及中日韩统一字符。

Big5 是针对繁体中文,广泛用于我国*地区和我国香港特别行政区等地区。

非Unicode编码小结:ASCII是基础,使用一个字节表示,最高位设为0,其他7位表示128个字符,其他编码都是兼容ASCII的,最高位用1来进行区分。 西欧主要使用Windows-1252,使用一个字节,增加了128个字符。我国内地的三个主要编码GB2312、GBK

、GB18030有时间先后关系,表示的字符数越来越多,且后面的兼容前面的,GB2312和GBK都使用两个字节,而GB18030使用两个或四个字节表示。我国香港地区和*地区使用的主要编码是Big5.

如果文本里的字符都是ASCII码字符,那么采用以上任一编码方式都是一样的,但如果有高位为1的字符,除GB2313、GBK、GB18030外,其他编码都是不兼容的。比如Windows-1252和中文的各种编码是不兼容的,即使Big5和GB18030都能表示繁体字,

其表示方式也是不一样的,这样就会出现乱码。

2.Unicode编码

上面介绍了中文和西欧的字符与编码,但在世界上还有很多其他国家的字符,每个国家的各种计算机厂商对自己常用的字符进行编码,在编码的时候忽略了其他国家的字符和编码,甚至忽略了同一国家的其他计算机厂商,这样造成的结果就是,出现了太多

的编码且互不相容。

世界上所有的字符能不能统一编码呢?可以,这就是Unicode。

Unicode做了一件事,就是给世界上所有的字符都分配了一个唯一的数字编号,这个编号范围从0x000000-0X10FFFF,包括110多万。简单理解,Unicode主要做了这么一件事,就是给所有字符分配了唯一数字编码。但是没有规定这个编号怎么对应到二进制表示。

跟上面介绍的其他编码不同,其他编码都即规定了能表示哪些字符,又规定了每个字符对应的二进制是什么,而Unicode本身只规定了每个字符的数字编号是多少。

UTF-32 就是字符编号的整数二进制形式,4个字节。每个字符都用4个字节表示,非常浪费空间,实际采用的比较少。

UTF-16 使用变长字节表示,常用于系统内部编码,UTF-16比UTF-32节省了很多空间,但是任何一个字符都至少用两个字节表示,对于美国和西欧国家而言,还是浪费很多空间的。

UTF-8 使用变长字节表示,每个字符使用的字节个数与Unicode编号的大小有关,编号越小使用的字节就少,编号大的使用的字节就多。使用字节个数为1-4个不等。

Unicode编码小结:Unicode给世界上所有的字符都规定了一个统一的编号,编号范围达到110多万,但大部分字符都在65536以内。Unicode本身没有规定怎么把这个编号对应到二进制形式。UTF-32/UTF-16/UTF-8都在做一件事,就是把Unicode编号对应到二进制

形式,其对应的方法不同。UTF-32使用4个字节,UTF-16大部分是两个字节,少部分是4个字节,它们都不兼容ASCII编码,都有字节顺序的问题。UTF-8使用1-4个字节表示,兼容ASCII编码,英文使用1个字节,中文字符大多使用3个字节。

 

上一篇:049_Unicode字符编码


下一篇:2021-07-04