Java学习 编码解码

字符串--->字节数组:编码

字节数组--->字符串:解码

        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 表示 当再次编码之后就不能恢复了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值