JavaWeb中的编码

首先解答一个问题,为什么要编码?因为人类的语言太多,比如英语,汉语,日语等等,表示这些语言的符号太多,无法用计算机中的基本存储单元——字节(byte)来表示(一个字节,8位Bit,最多能表示0~255个),所以必须要经过一些转换,翻译,才能让计算机明白我们的语言所代表的意思。假设计算机能理解的语言是英语,那么我们说汉语的,写汉字的,必须经过翻译成英语,计算机才能理解。这个翻译的过程就是编码。

现代计算机中提供了多种翻译方式,即编码格式,常见的有ASCII码,ISO-8859-1,GB2312,UTF-8等。能够表示汉字的有GB2312,GBK,UTF-8,UTF-16,下面简单介绍一下这些编码。

1.ASCII码

总共有128个,用一个字节的低七位表示,0~31是控制字符如换行,回车,退格等。32~126是打印字符,可以通过键盘输入并且能够显示出来。

2.ISO-8859-1

ISO-8859-1 到 ISO-8859-15是ISO组织在ASCII码基础上又制定了一系列标准来扩展ASCII码,其中ISO-8859-1涵盖了大多数西欧语言字符,所以应用最广泛。它任然是单字节编码,所以不能用在汉字上,它总共能表示256个字符。

3.GB2312

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

4.GBK

GBK全称是《汉字内码扩展规范》,是国家技术监督局为Windows95所制定的新的汉字内码规范,它的出现是为了扩展GB2312,并加入更多的汉字。它的编码范围是8140~FEFE(去掉XX7F),总共有23940个码位,能表示21003个汉字,它的编号和GB2312是兼容的,也就是说用GB2312编码的汉字可以用GBK来解码,并且不会乱码。

5.GB18030

GB18030全称是《信息技术 中文编码字符集》,是我国的强制标准,它可能是单字节,双字节或者四字节编码,它与GB2312是兼容的,在实际应用中很少。

6.UTF-16

说到UTF必须提到Unicode(Universal Code 统一码),ISO试图创建一个全新的超语言字典,世界上所有的语言都可以通过这个字典来互相翻译,可想而知这个字典是多么复杂。关于Unicode的详细规范可以参考相应文档。Unicode是Java和XML的基础。

UTF-16具体定义了Unicode字符在计算机中的存取方法。UTF-16用两个字节来表示Unicode的转化格式,它采用定长的表示方法,即不论什么字符都可以用两个字节表示。两个字节是16个Bit,所以叫UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,大大简化了字符串的操作,这也是Java以UTF-16作为内存的字符存储格式的一个重要原因。

7.UTF-8

UTF-16统一采用两个字节来表示一个字符,虽然在表示上非常简单,方便,但是也有其缺点,就是浪费,因为很多字符用一个字节就可以表示了,但是现在固定是两个。这会增大网络传输的流量,而UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1~6个字节组成。UTF-8的编码规则如下:

(1)如果是1个字节,最高位(第八位)为0,则表示这是一个ASCII码字符(00~7F)。也就意味着,所有的ASCII编码已经被包含进UTF-8了。

(2)如果是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。

(3)如果是1个字节,以10开始,表示它不是首字节,则需要向前查找才能得到当前字符的首字节。

对于中文字符的编码而言,GB2312与GBK编码规则类似,但GBK范围更大,能处理所有汉字字符,所以GBK优于GB2312。UTF-16与UTF-8都是处理Unicode编码,它们的编码规则不太相同。相对来说,UTF-16的编码效率较高,从字符到字节的相互转换更简单,进行字符串操作也更好。它适合在本地磁盘和内存之间使用,可以进行字符和字节之间的快速切换,但是它不适合在网络之间传输,如前面所说,它浪费了很多带宽,另外网络传输容易损坏字节流,一旦字节流损坏将很难恢复,所以相比较而言UTF-8更适合在网络中传输。UTF-8对ASCII字符采用单字节存储,另外单个字符损坏也不会影响后面的其他字符,。UTF-8在编码效率和安全性上做了平衡,是理想中的中文编码方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值