Java Web中的中文编码问题(上)

因为Java是跨平台语言,在不同平台编码之间的切换较多,所以java中的编码问题经常出现。

为什么要编码?

★计算机中存储信息的最小单元是一个字节(byte),即8bit,所以能够表示的字符是0~255个。

★人们需要表示的语言和符号太多,无法用1个字节完全表示。因而必须要经过“拆分”或一些“翻译”工作,才能使得计算机理解我们的语言。

解决这个矛盾必须要有一个新的数据结构char,从char到byte必须编码。


几种常见的编码格式:

1.ASCII码

总共128个,1个字节的低7位表示,0~31是控制字符如换行、回车、删除等,32~126是打印字符,可以通过键盘输入显示出来。

2.ISO-8859-1

扩展ASCII,ISO-8859-1到ISO-8859-15,ISO-8859-1涵盖了大多数西欧语言字符,故应用最广泛。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号,总共能表示256位。

3.GB2312

《信息技术  中文编码字符集》,双字节编码,范围A1~F7,其中A1~A9是符号区,共682个符号;B0~F7是汉字区,包含6763个汉字。

4.GBK

《汉字内码扩展规范》,编码范围8140~FEFE(去掉XX7F),共23940个码位,能表示21003个汉字,和GB2312兼容,也就是用GB2312编码的汉字可以用GBK解码,不会有乱码。

5.GB18030

《信息技术 中文编码字符集》,我国强制标准,与GB2312编码兼容,实际应用不广泛。

6.UNICODE字符集

UNICODE(Universal Code 统一码)字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。Unicode是java和XML的基础,下边将详细介绍Unicode在计算机中的存储形式。
UTF-16用两个字节来表示Unicode的转化格式,采用定长的表示方法,即不论什么字符都可以用两个字节表示。两个字节16bit,所以叫UTF-16。
每两个字节表示一个字符,大大简化了字符串操作,所以java以UTF-16作为内存的字符存储格式。
UTF-16统一采用两字节来表示一个字符,表示上简单方便,但是有很大一部分字符用一个就可以表示的则也需要用两个字节,存储空间放大了一倍,这样会增加网络传输流量,而且没有必要。所以UTF-8采用了一种变长技术,每个编码区域有不同的字码长度,不同类型的字符可以由1~6个字节组成。
UTF-8有如下编码规则:
●如果是1个字节,最高位(第八位)为0,则表示这是一个ASCII字符(00~7F),所以说所以ASCII编码已经是UTF-8了;
●如果是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数。例如110xxxxx代表它是双字节UTF-8的首字节;
●如果是1个字节,以10开头,表示它不是首字节,则需要向前查找才能得到当前字符的首字节。



JAVA内存编码采用UTF-16,但不适合在网络之间传输,因为网络传输容易损坏字节流,一旦字节流损坏将很难恢复。
UTF-8对ASCII字符采用单字节存储,单个字符损坏不会影响后边的其他字符,在编码效率上介于GBK和UTF-16之间,所以UTF-8在编码效率和编码安全性上做了平衡,是理想的中文编码方式。

猜你喜欢

转载自blog.csdn.net/liushulin183/article/details/50165775
今日推荐