String编码和解码问题

由 "IO" 引发的乱码问题, 让我想我想知道, 究竟是如何产生的,于是我就开始学习如下知识 

一: 首先了解一下编码表的概念:

 

二:上代码&解释

package io;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 * String类的编码和解码问题
 * 
 * byte[] getBytes(String charsetName) 
 * 字符串的编码: 就是将字符串变成字节数组: 人看的懂的 变成 机器看的懂的
 * 
 * String(byte[] bytes, String charsetName) 
 * 字符串的解码: 就是将字节数组变成字符串: 将 机器看的懂的 变成 人看的懂的
 * @author 王XX
 *
 */
public class StringDemo {
	
	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "世界";
		
		//因为我将eclipse的工作区间设置为了UTF-8,所以它默认就使用了UTF-8编码
//		byte[] bytes = str.getBytes();//[-28, -72, -106, -25, -107, -116]
//		byte[] bytes = str.getBytes("UTF-8");//[-28, -72, -106, -25, -107, -116]
		
		//str.getBytes(String charsetName): 用指定格式编码 
		byte[] bytes = str.getBytes("GBK");//[-54, -64, -67, -25], 从这里也可以看出,如果使用GBK编码的话,一个中文字符,占两个字节
		System.out.println(Arrays.toString(bytes));
		
		
		//编码使用 GBK, 解码使用UTF-8,会出现乱码
		System.out.println(new String(bytes,"UTF-8"));//����
		
		//编码使用 GBK,解码使用GBK,不会出现乱码
		System.out.println(new String(bytes,"GBK"));//世界
		
		/**
		 * 	一:反之,如果编码使用UTF-8,但是解码却使用GBK,也会导致乱码
		 *	      如果编码使用UTF-8,但是解码也是使用UTF-8,将不会导致乱码
		 *
		 *  总结:
		 *  	只要编码和解码一致,就不会产生乱码!!!
		 *  
		 *  
		 *  二: 关于编码和解码的问题,举个栗子: 发电报
		 *      比如发: 壹
		 *  	
		 *  共产党编码表(比作UTF-8吧),编码表:由现实世界的字符和对应的数值组成的一张表
		 *  比如这里的字符是壹,但在底层它不是用壹来表示,会用一个数值来表示,我这里就拿一来演示了
		 *  	字符	数值
		 *  	壹   	  1
		 *  
		 *  发送端: 壹  ---> 数值 ---> 二进制 ---> 发出去了	
		 *  接收端: 接收 ---> 二进制---> 数值 ---> 字符 ---> 壹
		 *  
		 *  
		 *  如果接收端不是用共产党编码表来解码的,而是国民党编码表来解码的!,假如中间被拦截了
		 *  国民党编码表(比作GBK吧)
		 *  	字符		数值
		 * 	one		1
		 * 
		 *  接收端: 接收 ---> 二进制 ---> 数值(1) ---> one  就把它解析错了
		 *  
		 *  这就相当于拿: utf-8 编码的, 拿GBk解码会出现乱码
		 */
	}
}

其实我感觉,其实很多东西是相通的,这个编码和解码,感觉和加密&解密,原理应该类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值