日期:2014-05-20  浏览次数:20733 次

java unicode编码
众所周知,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编码。
有人能帮我解答一下么?非常感谢。

------解决方案--------------------
不是的,unicode,utf-8等是字符编码,相当于把世界上存在的字符人为赋予了一个数字ID,所占大小取决于样本空间大小。而byte,int等是数值,所占大小取决于数值的取值范围。虽然二者在存储空间上存在相似,但并不代表具有你说的关联。
------解决方案--------------------
占用多少字节,是指占用多少内存空间,和使用什么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种规定,不像字符串,可以有多种规定,因为每个国家的文字不一样,但是阿拉伯数字和英文数字以及一些常用的标点符号是一样的。



------解决方案--------------------
谁跟你说这样调用的?

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 头的。
------解决方案--------------------
关于上一层楼的问题,有兴趣的话可以看看之前的讨论帖子:

【竞答】String.getBytes("Unicode")中,额外2个字节的来源
http://topic.csdn.net/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html