编码及常见的编码方式

  以下内容为许令波先生所著《深入分析Java Web技术内幕》的学习及归纳总结。


1. 编码

  编码是信息从一种形式或格式转换为另一种形式的过程。在计算机里,将我们人类所使用的语言转化为计算机所使用的语言(二进制)的过程,即为编码。

  由于人类的语言太多,表示这些语言的符号太多,无法用计算机中一个基本的存储单元——字节(byte)来表示,因而必须要经过拆分或一些翻泽工作,才能让计算机理解我们的语言。我们可以把计算机能够理解的语言假定为英语,其他语言要能够在计算机中使用,必须得经过一次翻译,把它翻译成英语。这个翻译的过程就是编码。

编码的原因可以总结为以下2条:
I. 在计算机中存储信息的最小单元是1个字节,即8个bit,所以能表示的字符范围是0~255个。
II. 人类要表示的符号太多,无法用1个字节来完全表示。要解决这个矛盾必须要有一个新的数据结构char,而从char到byte必须编码。

2. 常见的编码方式

  在计算机中提供了多种翻译方式,常见的有ASCII,ISO-8859-1,GB2312,GBK,UTF-8,UTF-16等。它们都可以被看作字典,它们规定了转化的规则,按照这个规则就可以让计算机正确地表示我们的字符。
 

ASCII码

  学过计算机的人都知道ASCII码,总共有128个,用1个字节的低7位表示,0~31是控制字符如换行、回车、删除等,32 ~126是打印字符,可以通过键盘输入并且能够显示出来。

ISO-8859-1

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

GB2312

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

GBK

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

G818030

  GB18030个称是《信息技术中文编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与GB2312编码兼容,虽然是国家标准,但是在实际应用系统中使用得并不广泛。

UTF一16

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


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


UTF-8

  UTF-16统一采用两个字节来表示一个字符,虽然在表示上非常简单、方便,但是也有其缺点,有很大一部分字符用一个字符就可以表示的现在要用两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的情况下,这样会增大网络传输的流量,而且也没有必要。而UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1~6个字节组成。

UTF-8有以下编码规则:
1.如果是1个字节,最高位(第8位)为0,则表示这是1个ASCII字符(00~7F)。可见,所有ASCII编码己经是UTF-8了。
2.如果是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。
3.如果是1个字节,以10开始,表示它不是首字节,则需要向前查找才能得到当前字符的首字节。

猜你喜欢

转载自blog.csdn.net/why_still_confused/article/details/52303552
今日推荐