字符串--->字节数组:编码
字节数组--->字符串:解码
String str = "汤姆";
//编码 默认编码格式是GBK
byte[] buf = str.getBytes();
for(byte b : buf){
System.out.print(b+" ");
}
结果:
-52 -64 -60 -73
String str = "汤姆";
//指定编码格式 为utf-8
byte[] buf = str.getBytes("utf-8");
for(byte b : buf){
System.out.print(b+" ");
}
结果:
-26 -79 -92 -27 -89 -122
String str = "汤姆";
byte[] buf = str.getBytes();
//解码默认也是GBK
String str2 = new String(buf);
System.out.println(str2);
========================================
String str = "汤姆";
byte[] buf = str.getBytes("utf-8");
String str2 = new String(buf,"utf-8");
System.out.println(str2);
结果:
汤姆
编码解码问题:
public static void main(String[] args) throws IOException, ClassNotFoundException {
//如果一个字符串使用GBK编码,
//使用iso8859-1解码 那么输出来的字符串就会乱码
//我们在不知道解码格式情况下 怎么进行重新恢复呢?
String str = "杰瑞";
byte[] b = str.getBytes("gbk");
for(byte x :b ){
System.out.print(x+" ");
}
String s = new String(b,"iso8859-1");
System.out.println();
System.out.println(s);
//
byte[] bb = s.getBytes("iso8859-1");
for(byte x :bb ){
System.out.print(x+" ");
}
String s2 = new String(bb,"gbk");
System.out.println();
System.out.println(s2);
}
结果:
-67 -36 -56 -16
????
-67 -36 -56 -16
杰瑞
原理图如下:
public static void main(String[] args) throws IOException, ClassNotFoundException {
//如果一个字符串使用GBK编码,
//使用iso8859-1解码 那么输出来的字符串就会乱码
//我们在不知道解码格式情况下 怎么进行重新恢复呢?
String str = "杰瑞";
byte[] b = str.getBytes("gbk");
for(byte x :b ){
System.out.print(x+" ");
}
String s = new String(b,"utf-8");
System.out.println();
System.out.println(s);
//
byte[] bb = s.getBytes("utf-8");
for(byte x :bb ){
System.out.print(x+" ");
}
String s2 = new String(bb,"gbk");
System.out.println();
System.out.println(s2);
}
结果:
-67 -36 -56 -16
????
-17 -65 -67 -17 -65 -67 -17 -65 -67 -17 -65 -67
锟斤拷锟斤拷
我们发现utf-8使用时乱码
原因如下:
iso8859-1将GBK的解码之后在ISO中有对应的字符(虽然不是正确的字符),再次编码之后就能恢复了
但是utf-8不一样 将GBK的解码之后在u8中没有对应的字符 就使用?代替 而?是由-17 -65 -67 表示 当再次编码之后就不能恢复了