在探索这个问题之前,我不懂序列化,只知道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位放在一个字节里,如果没有顺序,高低反了,这个值就变了,也得不到原来符。
编码懂了这些,再深入,也应该不难了。