JAVA开发编码全解析(一)----编码的由来和种类

来源:互联网 发布:360端口查看器 编辑:程序博客网 时间:2024/04/30 01:04

今天我们来讲一讲编码的问题

首先还是明确一下概念:什么叫编码?
举个例子,我们写个程序,保存一个字符a,那这个a保存到了哪里呢,如果是个局部变量,它可能保存到了内存里,如果是写到文件里,它可能保存到了硬盘里。
那它保存成什么样?是说我们就在内存或者硬盘中保存了一个”a”?

这显然是不可能的。
因为计算机只能识别0/1,所以它必然是以二进制的形式被保存了。好,那我们假设a被保存成了1。
这个时候,你又发现问题了,因为字母有很多,如果a=1,那剩下的25个字母怎么办,且不说还有各种标点符号。
那我们就不能用1位的二进制来保存,需要多几位。
多几位呢?这个不需要咱们自己来算了,已经有人算好了。我们用从0到127的128个数字来代表信息的规范编码,其中包括33个控制码,一个空格码,和94个形象码。形象码中包括了英文大小写字母,阿拉伯数字,标点符号等。
128也就是2的7次方,7位。实际上大部分电脑都用了8位来标示一个字符。也就是2的8次方,等于256。

这样每一字符便可能有256个不同的数值。由于我们只规定了128个编码,剩下的另外128个数码没有规范,这样我们在不同电脑间交换文件的时候,就有必要区分两类不同的文件。第一类文件中每一个字都是我们规定好的形象码或空格码。这类文件我们暂且称之为“文本文件”,通常可在不同电脑系统间直接交换。第二类文件,也就是含有控制码或形象码之外的文件,通常不能在不同电脑系统间直接交换。这类文件我们称之为叫“二进制文件”。

现在我们返回头来看一下,其实也挺简单的:
电脑用8位的二进制来保存一个字符,这样一个字符可以标示出256种意义,其中我们规定好了的有128种,还有128种是在此之外的。

但是!亲,我们没有加中文啊有木有!!中文可是有上万个啊,8位完全不够用啊!!!

有一个解决方案是这样的:常用的中文加上标点符号什么的,总数大概有8000多个,我们定义一个94乘94的区域,区域中的每格,都表示一个中文or中文标点符号。
比如“中”字在区域的54*48格,它的区位码就是5448。

由于前面我们规定的形象符的编码是从33到126,汉字区位码如果各加上32,就会与形象码的范围重合。如上例“中”字,区位码加上32后,得86,80。这两个数字的十六进制放在一起得5650,而与其相对应的两个英文符号是:VP。

这样就产生了一个如何区分中文字符与英文字符的问题。在一个中英文混用的文件里,“VP”到底代表“中”字呢,还是代表两个英文字母?

我想说到现在,你要么明白了,要么懵逼了。。。。

我们简单来梳理一下:因为中文比较多,8位远远满足不了要求,所以我们找到了一个新的解决方案,用两个英文字符来表示一个中文字符,也就是双字节的表示法(这也是为什么大家在开发中,经常会遇到说一个中文占2个字节)。
但是这个解决方案有另外一个问题,就是电脑不知道现在存储的是一个中文字符还是2个英文字符。。。

所以其实呢,这还是一个很苦逼的东西,尤其是对于中日韩这些使用表意字符的国家。因为每个字符你都要判断,这个字符到底是不是中文,如果是中文,它是这个中文的前半截啊,还是后半截啊。。。

有没有什么办法来解决这个问题呢?

其实解决的办法很简单,中文需要占用2个字节,英文只需要占用一个字节,那我们就统一一下,不管什么文,都占用2个字节,也就是16位。

皆大欢喜。

OK,现在我们来梳理一下前面的各种解决方案:

  • 最初我们说的,定义的只包含128位的英文的解决方案,实际上是ASCII(美国信息交换标准编码,简称美标)
  • 后来我们想到的双字节来表示一个汉字的解决方案,实际上是GB(中华人民共和国国家标准,简称国标)
  • GB可能你不太熟悉,但是我相信你熟悉它的很多变种:比如GBK,实际上它是GB的扩展版,对多达2万多的简繁汉字进行了编码;比如GB-2312,是GB的一个版本,它只包含6000多个汉字;再比如BIG5,它是针对繁体汉字的汉字编码,在台湾、香港的电脑系统中得到普遍应用。
  • 最后我们想到的用16位来统一表示中英文字符,实际上就是Unicode
  • 当然,还有我们没有在上文中提到,但是大家都遇到过的ISO,它实际上指的是国际标准化组织。1993年,国际标准ISO10646 定义了通用字符集(Universal Character Set, UCS)。 UCS 是所有其他字符集标准的一个超集。它保证与其他字符集是双向兼容的。就是说, 如果你将任何文本字符串翻译到 UCS格式,然后再翻译回原编码, 你不会丢失任何信息。
0 0
原创粉丝点击