Java中String的数据是如何存储的,查看源代码就能够知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节
咱们还知道,如今广泛使用的unicode版本是UCS-2,就是使用2个字节表示一个字符的unicode版本,这就对上了,java使用的就是UCS-2标准,因此,String中的value中存储的都是一个个数字java
好比’你’的unicode编码是4f60,看下面的测试代码web
char c = '你'; System.out.println(Integer.toHexString(c)); System.out.println(Integer.valueOf(c)); System.out.println(c);
结果是:
4f60
20320
你数组
因此呢,如今咱们知道了String内部其实存储的是未经任何编码的unicode编码,就是那个对应字符的编码,而后再看咱们这两个方法:浏览器
getBytes(charsetname)
意思是根据这个编码来获取字节数组
这又是什么意思呢?
就是说将内存中的unicode编码转换为charsetname格式所对应的字节数组
好比’你’,转换为utf-8是三个字接,因此获得的字节数组就是三个字节的
即[e4 bd a0]测试
而后String(bytes,charsetname)呢编码
意思就是将bytes这个字节数组按照charsetname解释,组装为一个String保存起来
例如上面那个字节数组[e4 bd a0],按照utf-8解释的话,存储起来就是”你”这个字符串,若是按照其余编码解释,则不会解释为”你”spa
说个其余的,为何在servlet中处理参数通常都须要这么一句了来控制编码:code
String str = new String(param.getBytes(“ISO-8859-1”),”UTF-8”);内存
其实这很好理解,浏览器传过来的字节数据是UTF-8编码的,而后web容器默认这个字节数据是ISO-8859-1编码的,因此使用ISO-8859-1把这个字节数据转换变成了String存储起来,至关因而进行了下面这个操做:utf-8
String s = new String(UTF8Bytes,”ISO-8859-1”);
注意这个编码是单字节的,也就是将每个字节都转换成了unicode编码,幸亏是这样,使咱们有机会将这个String再转换成和原来如出一辙的字节数组,因此才有了咱们平时用的最多的那一句编码处理的代码
最后,想再说一下,对编码这块不了解的缘由,是咱们理解错误,咱们必须知道的是:
java内部存储字符串使用的unicode编码
咱们一般会听到有人说:“我须要将String由ISO-8859-1转换为GBK编码”,这又是怎么回事呢?实际上,咱们并非要“将 一个由ISO-8859-1编码的String转换为GBK编码的String”,反复说明的是,JAVA中的String都是unicode编码的,因此不存在“ISO- 8859-1编码的String”或“GBK编码的String”这样的说法。而须要转换的惟一的缘由是String进行了错误的编码。咱们常常会碰到由ISO-8859- 1转换为诸如GBK/UTF-8等等这样的需求。所谓的转换过程是:String –> byte[] –>String