• 编码


    编码

    为什么要编码?

    ◎ 在 计 算 机 中 存 储 信 息 的 最 小 单 元 是 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编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
             */
    
    
  • 相关阅读:
    hdu 1203 I NEED A OFFER! 01背包
    hdu2602 Bone Collector 01背包
    hdu 2546 饭卡 01背包
    ACM-ICPC 2018 焦作赛区网络预赛 G Give Candies
    ACM-ICPC 2018 焦作赛区网络预赛 I Save the Room
    poj1564 Sum It Up dfs水题
    VS2019生成并使用动态链接库(自测有用)
    英语发音基础五天搞定之第三天
    Some thoughts in the Novel Coronavirus holiday
    ​英语发音基础五天搞定之第二天
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/13857073.html
Copyright © 2020-2023  润新知