众所周知,java使用的是unicode编码,我困惑的是unicode编码不是把大部分字节按照2个字节编码,如utf-16,最多的也是utf-32,每个字符按照4个字节编码,但是在一开始学习java的时候,每本书都会告诉大家8个primitive 类型的数据的大小:如:byte是8its(1个字节),char和short是16bits(2个字节),int ,float是32字节(4个字节),double和long是64bits(8个字节),这里的意思是表示每个数据类型使用不同的unicode编码方式么?如:byte是utf-8编码,char.shout,是utf8或者utf16编码。
有人能帮我解答一下么?非常感谢。

解决方案 »

  1.   

    不是的,unicode,utf-8等是字符编码,相当于把世界上存在的字符人为赋予了一个数字ID,所占大小取决于样本空间大小。而byte,int等是数值,所占大小取决于数值的取值范围。虽然二者在存储空间上存在相似,但并不代表具有你说的关联。
      

  2.   

    unicode说的是字符,而我说的数值,对吧。
      

  3.   

    占用多少字节,是指占用多少内存空间,和使用什么unicode没有关系
    比如
    byte a = 1; //那么a在内存中占用1个字节
    short b = 1; //那么b在内存中占用2个字节
    对于字符串,缺省的是unicde编码,所以
    String s1 = "编码"; //s1在内存中占用4个字节(一个汉字两个字节)
    byte[] bs1 = s1.getBytes(); //获得字符串的字节数组(也就是在内存中每个字节空间保存的信息)
    System.out.println(bs1.length); //可以查看获得缺省编码的字节数组长度
    byte[] bs2 = s1.getBytes("UTF-8"); //不同编码,占用空间不一样
    System.out.println(bs1.length); //所以返回的字节数组长度不一样
    byte[] bs3 = s1.getBytes("UTF-16"); //不同编码,占用空间不一样
    System.out.println(bs1.length); //所以返回的字节数组长度不一样所以,占用空间和unicode编码是两个概念,比如说,1个byte是1间房,那么对于byte信息,我们就用1间房来储存,对于short信息,我们就用2间房来存储,对于字符串信息,如果采用unicode编码,我们就用2间房来存储一个汉字,如果采用utf-16编码,我们就就用4间房来保存1个汉字,如果采用utf-8编码,可能会用3间房来保存1个汉字,所以编码只是对于字符串信息在内中如何分配做个规定,根据不同的编码,占用空间不一样,和基本类型不是一个概念,基本类型所占用的空间是不变的,没有编码之说,也就是说,基本类型的内存分配只有1种规定,不像字符串,可以有多种规定,因为每个国家的文字不一样,但是阿拉伯数字和英文数字以及一些常用的标点符号是一样的。
      

  4.   

    unicode 就是 unicode 和其他编码么关系来着。
      

  5.   

    我看了您的解答:得出
    1.unicode编码是对字符来说的,对于primitive类型的值没有unicode编码之说,这些类型中规定的所占字节是其能表达的最大值占的最大字节,比如int 占4个字节,是说int 值最大能占4个字节,所以它的最大值只能从(-2的31次)到(-2的31次再减1).
    2.java中对字符编码我绝对跟默认平台的字符编码有关,不过编码的时候可以指定编码方式。
    看下面的源代码:
    public class Unicode
    {
    public static void main(String[] args)throws Exception
    { Integer b=0;
            System.out.println("int "+b+" "+b.toString().getBytes().length);
                  
    Character c='a';
    System.out.println("char "+c+" "+c.toString().getBytes().length); Short d=1;
    System.out.println("short "+d+" "+d.toString().getBytes().length);         Double e=1.8;
    System.out.println("double "+e+" "+e.toString().getBytes().length); Double f=2e44;
    System.out.println("Double "+f+" "+f.toString().getBytes().length);
                    
    //我默认平台是UTF-8编码
    String g="1";
    System.out.println("String "+g+" "+g.getBytes().length );
    System.out.println("String "+g+" "+g.getBytes("unicode").length );
    System.out.println("String "+g+" "+g.getBytes("UTF-8").length );
    System.out.println("String "+g+" "+g.getBytes("UTF-16").length );
    System.out.println("String "+g+" "+g.getBytes("GBK").length );

    String h="汗";
    System.out.println("String "+h+" "+h.getBytes().length);//我的平台默认utf-8
    System.out.println("String "+h+" "+h.getBytes("unicode").length);//我的平台默认utf-8
    System.out.println("String "+h+" "+h.getBytes("UTF-8").length);//我的平台默认utf-8
    System.out.println("String "+h+" "+h.getBytes("UTF-16").length);//我的平台默认utf-8
    System.out.println("String "+h+" "+h.getBytes("GBK").length);//我的平台默认utf-8

    }
    }
    输出:int 0 1
    char a 1
    short 1 1
    double 1.8 3
    Double 2.0E44 6
    String 1 1
    String 1 4
    String 1 1
    String 1 4
    String 1 1
    String 汗 3
    String 汗 4
    String 汗 3
    String 汗 4
    String 汗 2虽然我并不知道我有没有完全懂了java的遍码,但是我还是懂了些许,非常感谢。
      

  6.   

    谁跟你说这样调用的?h.getBytes("unicode")
    h.getBytes("UTF-16")UTF-16 不像 UTF-8,UTF-16 是有 BOM 的,而且还有 UTF-16BE 还是 UTF-16LE 的unicode 并不是编码格式,所以你用 getBytes unicode 的话在 java 内部会使用 UTF-16LE 来处理,并且加上 BOM 头的。
      

  7.   

    关于上一层楼的问题,有兴趣的话可以看看之前的讨论帖子:【竞答】String.getBytes("Unicode")中,额外2个字节的来源
    http://topic.csdn.net/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html