/*
* 【编码】字符串转成字节数组(看得懂的-->看不懂的)
* 【解码】字节数组转成字符串(看不懂的-->看得懂的)
*/
package demo;
import java.io.UnsupportedEncodingException;
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你好";
//编码
byte[] buf = str.getBytes("GBK");
printBytes(buf);
}
public static void printBytes(byte[] buf) {
for(byte b : buf){
System.out.print(b + " ");
}
}
}
/*
* 【运行结果】-60 -29 -70 -61
*
* 原因:因为一个中文=2字节,每个字节最高位为1,即为负数,所以-60和-29是“你”的编码,-70和-61是“好”的编码
* (下同)
*/
/**
* 查找API,发现String类有如下方法:
* public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
* 即在调用getBytes()方法时,可以指定编码表进行编码,在括号内传入"GBK","UTF-8"等即可
*/
/*
* 由此可得,中文“你好”的编码:
* GBK:-60 -29 -70 -61
* UTF-8:-28 -67 -96 -27 -91 -67
*/
========================分割线<span style="font-family: Arial, Helvetica, sans-serif;">========================</span>
<span style="font-family:Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">package demo;
import java.io.UnsupportedEncodingException;
public class Demo2 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你好";
//先用String类的getBytes()方法编码
byte[] buf = str.getBytes();
/**
* 对于解码,发现String类的构造函数可以完成:
* (1)public String(byte[] bytes):按照默认编码表(即当前计算机是什么,就用什么表)进行解码
* (2)public String(byte[] bytes,String charsetName) throws UnsupportedEncodingException
* 按照指定的charsetName编码表进行解码
*/
//解码1
String s1 = new String(buf);//按照默认编码表进行解码
System.out.println(s1);//由于上面是按照默认编码表进行编码,这里仍用默认编码表进行解码,所以输出你好
//解码2
String s2 = new String(buf,"UTF-8");//按照指定编码表进行解码
System.out.println(s2);//由于上面按照默认编码表(GBK)进行编码,这里用UTF-8进行解码,前后码表不匹配,所以输出???
}
}