由 "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解码会出现乱码
*/
}
}
其实我感觉,其实很多东西是相通的,这个编码和解码,感觉和加密&解密,原理应该类似