在java中,getBytes()方法若是不指定字符集,则获得的是一个操做系统默认的编码格式的字节数组;若是指定字符集,则获得的是在指定字符集下的字节数组,如:java
byte[] b_gbk = "中".getBytes("gbk"); byte[] b_utf8 = "中".getBytes("utf-8"); byte[] b_iso88591 = "中".getBytes("iso-8859-1");
将返回"中"这个汉字分别在gbk、utf-八、iso-8859-1编码下的字节数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。数组
与getBytes()方法相反,能够经过new String(byte[], charsetName)方法用指定的字符集来还原这个"中"字,如:编码
String s_gbk = new String(b_gbk, "gbk"); String s_utf8 = new String(b_utf8, "utf-8"); String s_iso88591 = new String(b_iso88591, "iso-8859-1");
经过打印出s_gbk、s_utf八、s_iso88591能够看到,s_gbk和s_utf8都是"中",而s_iso88591是一个乱码,这是由于iso-8859-1的编码表中,根本就没有包含汉字,所以"中".getBytes("iso-8859-1")获得的是"?"的字节数组表示,再经过new String(b_iso88591, "iso-8858-1")还原获得的是"?"。spa
有时候,为了让中文字符适应某些特殊要求(如http header要求其内容必须是iso-8859-1编码),可能会经过将中文字符按照字节方式来编码的状况,如:操作系统
String s_iso88591 = new String("中".getBytes("utf-8"), "iso-8859-1");
这样获得的字符串s_iso88591其实是三个在iso-8859-1中的字符,在将这些字符传送到目的地后,再经过相反的方式,即:code
String s_utf8 = new String(s_iso88591.getBytes("iso-8859-1"), "utf-8");
从而获得正确的中文汉字"中",这样就既保证了遵照协议规定,也支持了中文。blog
注:内存
byte[] b = "中".getBytes("utf-8"); for(int i=0; i<b.length; i++) { System.out.println(b[i]); }
输出-28 -72 -83是由于"中"的utf-8编码为三个字节,分别是E4 B8 AD,以E4为例,换成二进制即为:utf-8
1110 0100字符串
该二进制数将以补码存储在内存中,最高位被视为符号位,所以原码是:
1110 0100(补码) -> 1001 1011(反码) -> 1001 1100(原码)
即-(16+8+4)=-28