1.编码与解码
编码:字符通过编码字符集转为二进制
比如给出一个字符串String str="中国";
解码:二进制通过解码字符集转为字符
用一个byte数组来接受编码后的二进制 byte[] data=str.getBytes();
2.出现乱码的两种情况
第一,当解码与编码的字符不统一时,就会出现乱码
第二,缺少字节数,长度丢失,也会出现乱码
public class Demo07 { public static void main(String[] args) throws UnsupportedEncodingException { /** * 解码与编码字符集统一 否则乱码 */ // 解码 byte-->char String str = "中国"; // 编码 char-->byte byte[] data = str.getBytes(); // 编码与解码字符集统一为gbk System.out.println(new String(data));
当解码与编码的字符集统一时,不会出现乱码
输出正常为 中国
//修改data编码为“utf-8” data = str.getBytes("utf-8"); System.out.println(new String(data));
当改变编码字符集时,就会出现乱码
输出结果为:涓浗
<span style="white-space:pre"> </span>byte[] data2 = "中国".getBytes("utf-8"); str = new String(data2, "utf-8"); System.out.println(str);可以采用确定编码解码的字符集避免乱码出现,如上都设置为“utf-8”
输出结果正常 中国
<span style="white-space:pre"> </span>/** * 字节数不完整,出现乱码 */ String str2 = "中国"; byte[] data3 = str.getBytes(); System.out.println(new String(data, 0, 3)); } }
因为一个汉字占两个字节,这里需要4个字节,而byte数组长度为3 ,所以出现乱码
输出结果为 涓?
3.用转换流解决文件copy中乱码问题
转换流 字节流转为字符流
输出流 :OutputStreamWriter 编码过程
输入流 :InputStreamReader 解码过程
使用转换流的初衷是为了控制解码字符集,而只有节点流按byte读取,才可以设置字符集
所以用转换流讲字节流转换位字符流,从下面代码可以看出创建这样一个对象是比较复杂的
1)File对象
2)FileInputStream对象 ,节点流
3)InputStreamReader对象,转换流,同时设置字符集
4)BufferedReader对象,字符缓冲流
BufferedWriter思路一致
public class Demo07 { public static void main(String[] args) throws IOException{ //指定解码的字符集,前提需要知道文件编码使用的字符集 BufferedReader br=new BufferedReader( new InputStreamReader( new FileInputStream(new File("F:/Picture/test/test.java")),"gbk") ); //写出文件编码过程,这里的字符集可以任意指定 BufferedWriter bw=new BufferedWriter( new OutputStreamWriter( new FileOutputStream(new File("F:/Picture/test/test2.java")),"utf-8") ); //文件copy String info=null; while(null!=(info=br.readLine())){ bw.write(info); bw.newLine(); bw.flush(); } br.close(); bw.close(); } }