String的getBytes()方法是获得一个系统默认的编码格式的字节数组
getBytes("utf-8") 获得一个UTF-8格式的字节数组java
把String转换成bytes,各类编码转换成的bytes不一样,好比UTF-8每一个汉字转成3bytes,而GBK转成2bytes,因此要说明编码方式,不然用缺省编码。数组
都是将一个string类型的字符串转换成byte类型而且存入一个byte数组中。
在java中的全部数据底层都是字节,字节数据能够存入到byte数组。
存储字符数据时(字符串就是字符数据),会先进行查表,而后将查询的结果写入设备,读取时也是先查表,把查到的内容打印到显示设备上
getBytes()是使用默认的字符集进行转换,getBytes(“utf-8”)是使用UTF-8编码表进行转换。
在Java中,String的getBytes()方法是获得一个操做系统默认的编码格式的字节数组。这表示在不一样的操做系统下,返回的东西不同!服务器
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如:
byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");
将分别返回"中"这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时学习
b_gbk的长度为2,测试
b_utf8的长度为3,编码
b_iso88591的长度为1。spa
而与getBytes相对的,能够经过new String(byte[], decode)的方式来还原这个"中"字,操作系统
这个new String(byte[], decode)实际是使用指定的编码decode来将byte[]解析成字符串.
String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");
经过输出s_gbk、s_utf8和s_iso88591,会发现s_gbk和s_utf8都是"中",而只有s_iso88591是一个不被识别的字符(能够理解为乱码),为何使用ISO8859-1编码再组合以后,没法还原"中"字?缘由很简单,由于ISO8859-1编码的编码表根本就不包含汉字字符,固然也就没法经过"中".getBytes("ISO8859-1");来获得正确的"中"字在ISO8859-1中的编码值了,因此,再经过new String()来还原就更是无从谈起。
所以,经过String.getBytes(String decode)方法来获得byte[]时,必定要肯定decode的编码表中确实存在String表示的码值,这样获得的byte[]数组才能正确被还原。.net
注意:debug
有时候,为了让中文字符适应某些特殊要求(如http header要求其内容必须为iso8859-1编码),可能会经过将中文字符按照字节方式来编码的状况,如:
String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1"),这样获得的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再经过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来获得正确的中文汉字"中",这样就既保证了遵照协议规定、也支持中文。
最近在学JSP,在学习处理get方式提交数据出现乱码问题的时候,对其中的一个解决方法new String(s.getBytes("iso-8859-1"),"utf-8");产生了疑问,就是为何要使用s.getBytes("iso-8859-1")?
当时只这样想的:客户端向服务器发送一个请求,好比说是一个字符串"请求";以后服务器接收到这个请求,也就是这个字符串,但是这时因为某种缘由出现了乱码!这时为了解决这个问题,使用new String(s.getBytes("iso-8859-1"),"utf-8");解决问题。看到这条语句,我感受想不通啊,字符使用iso-8859-1编码取得字节序列,再由utf-8解码取得字符串,获得的仍是乱码啊!怎么会取得正确的字符呢!!!想不通啊!
以后,经过查找资料,获得了一点想法,代码以下:
1 public class ThinkIng { 2 public static void main(String[] args) throws Exception { 3 System.out.println("\t------JSP模拟------"); 4 System.out.println("客户端,有一个中文字符的请求(转换成了字节序列发送),发送至服务器端"); 5 String request="请求"; 6 byte[] client=request.getBytes();//客户端的请求的字节序列 7 print(client); 8 System.out.println();//分割用的 9 System.out.println("有一中间件,将发送的字符序列一默认的编码格式(iso-8859-1)进行解码"); 10 String sever=new String(client,"iso-8859-1"); 11 System.out.println(sever); 12 System.out.println("程序猿发现,这边有问题,中文有乱码,前来解决!"); 13 String debug=new String(sever.getBytes("iso-8859-1"),"gbk");//还原字节序列,使用“gbk”从新进行解码! 14 System.out.println(debug); 15 System.out.println("问题解决!"); 16 } 17 public static void print(byte[] b){//用于显示字节序列的 18 for(byte b1:b){ 19 System.out.print(Integer.toHexString(b1 & 0xff)+" "); 20 } 21 } 22 }
先前没有想通主要是本身没注意到:
总的来讲,乱码是因为编码方式与解码方式不一致致使的,这一句话没有理解透!若是当时这样想既然出现了乱码,确定是那边的编码格式和解码格式不一致,就行了!
注:编码:将字符串转换成字节序列;解码:将字节序列转换成字符串
感谢:http://liguocai2009.iteye.com/blog/1602256这篇文章给个人启发!