在硬盘中,所有文件都可以表示为字节,但是,对于文本文件,还需要把存储的字节信息转化为字符,这就需要通过对照编码表来实现字节与字符之间的转化
对于中文字符,常用的编码表为GBK和UTF-8,尽管都是中文的编码表,但是两张表的定义规则截然不同,所以不能替换使用
对于英文则有著名的ASCII码表,还有拉丁语系的ISO8859-1码表
在流和字节数组的操作中,都包含对编码表的利用
转换流的构造函数中:
——InputStreamReader(InputStream in,String charsetName)//charsetName就是编码表的名称,表示以charsetName编码表的形式把数据读取到字符流中
——OutputStreamWriter(OutputStream out,String charsetName)//表示以charsetName编码表的形式把流中数据输出到目的地
字节数组和字符串之间的转换过程中:
——getBytes(String charsetName)//表示以charsetName编码表的形式把字符串转化为字节数组
——String(byte[] b,String charsetName)//表示以charsetName编码表的形式把字节数组转化为字符串
流的演示:
import java.io.*;
class EncodeDemo1
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in,"GBK"));
BufferedWriter bufw1=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK"));
BufferedWriter bufw2=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("UTF-8.txt"),"UTF-8"));
String str;
while((str=bufr.readLine())!=null)
{
if(str.equals("over"))
break;
bufw1.write(str);
bufw1.newLine();
bufw1.flush();
bufw2.write(str);
bufw2.newLine();
bufw2.flush();
}
bufr.close();
bufw1.close();
bufw2.close();
}
}
为什么都能正常存储而不出现乱码呢?因为虽然在输入时确定了GBK的编码表,但是再导入到文件之前,已经被转换成了字符串,正常字符串再转化成不同码表所对应的编码并存起来,当然不会出现乱码
但是读取就不一样了
输入流使用UTF-8去读取GBK文件:
import java.io.*;
class EncodeDemo2
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("GBK.txt"),"UTF-8"));
String str;
while((str=bufr.readLine())!=null)
{
System.out.println(str);
}
bufr.close();
}
}
结果:
全乱码,这也证实了两个码表不通用的事实
字符数组的演示:
import java.io.*;
import java.util.*;
class EncodeDemo3
{
public static void main(String[] args) throws UnsupportedEncodingException//可能抛异常
{
byte[] b1="哈哈哈".getBytes("GBK");
byte[] b2="哈哈哈".getBytes("UTF-8");
System.out.println(Arrays.toString(b1));
System.out.println(Arrays.toString(b2));
String str1=new String(b2,"UTF-8");
String str2=new String(b2,"GBK");//选择错误编码表
System.out.println(str1);
System.out.println(str2);
}
}
结果:
乱码如期出现