在探索这个问题之前,我不懂序列化,只知道serializable接口,但是没用过。我知道utf-8,因为jsp页面不是utf-8的时候就出来乱码,至于为什么,觉得应该不是我应该关心的问题,所以没有去管。现在真遇到乱码解决不了了,才各种查资料了解,才发现编码如此重要。

//----------------------------------------------------------------------------------------------------------------------

进入正题:

计算机存储的最小单元是位,但是我们不可能用位单位去编程,所以出现字节(8位)(至于为什么8位,??)。好,我们用一个byte来表示编程环境中最小的存储单位。

int i = 1024; 那就是把1024这个数字转换成二进制,放在4字节(32位)的存储空间里,然后说,看,i 被程序表示出来了。

然后我们发现,我不是只存数字的,还有一些字符串String s = "hello world";这怎么存。是啊,这些字符不是数字怎么能用二进制表示呢。

好,计算机说,我现在给你一个规则:你要是想存这些字符,我给你一个  字符(char)--------数字-------二进制   之间的关系表给你,比如h 你可以用char 类型,然后给出字符h,然后我对照char类型中数字的那个表h  ------>   123 那我把h 当成123存储,放在char类型下。我取数据的时候,我先看是char 类型,那我先对应char类型的数字找到这个字符h,然后打印出来给你看。

好,既然有这个规则,那我们就可以将一个字符转换成特殊数字在计算机里存储、传输。如此,问题解决了。

所以除了0和1,char类型的数据是一个很重要的数据类型,String 是维护的char数组,int 是二进制数字,再上面,各种类对象,都是对这两种数据的封装。

那么,char类型好像解决了。

字符集

顾名思义,就是一套字符的集合,按照上面的理解,就是那个字符到数字的转化表(就像1+2 对应 3一样)。

:一开始有单字节的ASC码,即0-127个字符(最初的感觉就是意思意思),大家可以用就行,没考虑那么多。

:之后ASCII 出来了,说,我比之前的那个表表示的字符数要多一些,并且他有的我都有,大家用我。于是,单字节0-256个字符可以被表示出来。

大家懂的,发现一种东西的价值之后,人们就开始关注、研究。开始是一起研究,然后为了各自利益,分开研究(主观色彩),然后想技术本地化。这都是发展需要。

然后就有了很多字符集,在国内有名的

|----------字符集名称----------------------------|---------------存储字节数---------------|------------兼容性-------|

:ISO-8859-x系列  最广的是ISO-8859-1                         单字节                         肯定兼容ASC码

:GB2312                                                                 汉子双字节,ASC码单字节           向上兼容

:GBK                                                                        同上,就是字符集容纳了更多的汉字      ...

:Unicode(国际编码)                               

Unicode只定义了字符到数字的编码表但是具体的存储格式没有定义

于是有了下面的定义Unicode存储形式的格式

:UTF-16      不管什么字符都分配两个字节存储,这样的话,存取很方便,但是空间浪费(这在底层IO操作用的多)

:UTF-8        不同的字符区域定义不同的存储,如ASC码用一个字节存储,但是汉字用三个字节存储。(1--6个字节,可变存储)

好了,知道、确认字符集后,我们就可以把char 和 byte进行互转,只要首先确认转化的字符集名。

序列化:

将char 转化为 byte  流,就称为序列化,可以想象是将char转化的byte[]有序的存储和传递。

序列化也叫编码encode:char ---> byte[]

反序列化也叫解码decode : byte[] ---->char

这时候就想为什么是有序的,如果不是有序的,decode的时候,虽然是同一种格式,但是byte中内容变了,还是得不到原来的那个字符。

在gb2312中,汉字被分配两个字节存储,16位,低8位放在一个字节里,高8位放在一个字节里,如果没有顺序,高低反了,这个值就变了,也得不到原来符。

编码懂了这些,再深入,也应该不难了。