编码
为什么要编码?
◎ 在 计 算 机 中 存 储 信 息 的 最 小 单 元 是 1 个 字 节 , 即 8 个 bit, 所 以 能 表 示 的 字 符 范围是0〜255个。
◎ 人类要表示的符号太多,无法用1个字节来完全表示。
◎人类不同国家使用不同语言,需要被翻译。
编码的本质
计算机使用bit进行处理,编码就是多少个bit表示一个符号,然后对bit进行分割翻译。
如ASCII码用一个byte表示一个符号,那么ASCII编码的处理方式就是把数据用8个bit分割成很多个块,然后对每个块进行翻译。
不同的编码方式对多大的位长表示一个符号有区别。
编码格式
常 见 的 有 ASCII、 ISO-8859-1、 GB2312、 GBK、 UTF-8、 UTF-16 等
1、ASCII码用一个byte表示一个符号,只有128个表示,部分数字对应关系如下:
65 : A
66 : B
67 : C
68 : D
。。。。。
91 : [
92 :
93 : ]
94 : ^
95 : _
96 : `
97 : a
98 : b
2、GB系列用于汉字编码,两个字节表示一个汉字。
3、UTF系列和Unicode有关,iso组织试图用于统一编码格式,现有UTF-16和UTF-8常用。
UTF-16用两个字节表示一个符号,定长(随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码)。
UTF-8使用1-6个字节表示符号,不定长。
Java中的编码方式
char x='o';
char y='车';//char两个字节,可以存储一个汉字
System.out.println((byte)('a')); //97
System.out.println((int) ('b')); //98
/*
//jvm使用UTF-16进行编码,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,
Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。
*/
for(int i=1;i<=100000;i++){
System.out.println(i+" : "+(char)(i));
}
//选择编码方式来让机器选择将字节流(二进制)多少个位作为一个单位,然后转换成字符
char c='紽'; //一个char能表示65536个符号,这个汉字在这个范围内
System.out.println((byte)(c)); //61 一个byte无法表示这个汉字,错误
System.out.println((int)(c)); //32061
System.out.println((long)(c));//32061
/*
是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。
Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。
所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。
*/
char d='矿';//96255,这个汉字用一个char或者2个char存储,保持兼容,所以两个值都可以
System.out.println((char)(96255));//矿
System.out.println((int)(d)); //30719
System.out.println((long)(d));//30719
System.out.println((char)(30719));//矿
/*
Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。
Java序列化时,字符也采用UTF8编码,占1~6个字符。
总结:
1、java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。
2、java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。
3、UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
4、UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
*/