编码

编码

为什么要编码?

◎ 在 计 算 机 中 存 储 信 息 的 最 小 单 元 是 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编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
         */

posted @ 2020-10-22 11:13  cgl_dong  阅读(119)  评论(0编辑  收藏  举报