众所周知,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编码。
有人能帮我解答一下么?非常感谢。
有人能帮我解答一下么?非常感谢。
比如
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种规定,不像字符串,可以有多种规定,因为每个国家的文字不一样,但是阿拉伯数字和英文数字以及一些常用的标点符号是一样的。
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的遍码,但是我还是懂了些许,非常感谢。
h.getBytes("UTF-16")UTF-16 不像 UTF-8,UTF-16 是有 BOM 的,而且还有 UTF-16BE 还是 UTF-16LE 的unicode 并不是编码格式,所以你用 getBytes unicode 的话在 java 内部会使用 UTF-16LE 来处理,并且加上 BOM 头的。
http://topic.csdn.net/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html