从代码看java输入输出中的编码和解码


在java中,采用Unicode编码,英文字符和汉字都占两个字节,下面的代码都是在中文操作系统上执行的,系统采用GBK编码。

1.看一下下面这段代码的编码和解码:当我们在键盘上敲入字符的时候,其采用的是GBK编码,比如我们敲入'b',它占两个字节。read()每次读取一个字节,返回一个int数据,该int数据,int的构成是最低位字节是read读取的字节,其余24位补0,'b'就回了两个int数据。write(data),每次向输出流中写入一个字节,写入的字节是data的最低位字节,这样写入的字节就和输入'b'编码后的字节一致。然后系统在按照GBK进行解码输出显示'b'。

1 int data;
2 while((data=System.in.read())!=-1)
3 {
4 System.out.write(data);
5 }

2.再来看看这段代码的编码和解码:代码读取的文件中的数据存在计算机中,它采用GBK编码。input.read(array)将这些字节读入到array数组中。new String(array,0,len)采用的是系统默认字符集GBK(中文环境下)进行解码出字符串,字符串在计算机中采用Unicode进行编码存储。系统按照GBK进行解码字符串,并输出显示。

1 FileInputStream inPut = new FileInputStream("D:"+File.separator+"test"+File.separator+"hello.txt");
2 byte[] array = new byte[100];
3 int len = inPut.read(array);
4 System.out.println(new String(array,0,len));
5 inPut.close();

3.getBytes()采用系统默认字符集GBK编码“Hello FileOutputStreamaaa”,outPut.write(“Hello FileOutputStreamaaa”.getBytes())将这些字节写入到输出流中,系统采用GBK解码输出这些字节。

FileOutputStream outPut = new FileOutputStream("D:"+File.separator+"test"+File.separator+"hello.txt");
outPut.write("Hello FileOutputStreamaaa".getBytes());
outPut.close();

4.dos.writeByte(b)以一个字节的长度,向输出流中写入b,,dos.writeBoolean(a)以一个字节的长度,向输出流中写入a,而我们的本地系统采用GBK进行编码,所以会出现乱码,dos.writeInt(c)以四个字节的长度,向输出流中写入c,dos.writeChar(d)以两个字节的长度,向输出流中写入d。而我们当我们打开被写入的文件时,它是按照GBK进行解码(双字节)就会出现乱码。

FileOutputStream outPut = new FileOutputStream("D:"+File.separator+"test"+File.separator+"hello.txt");
BufferedOutputStream buffOutput = new BufferedOutputStream(outPut);
DataOutputStream dos = new DataOutputStream(buffOutput);
byte b = 1;
boolean a = false;
int c = 12;
char d = 'd';
dos.writeByte(b);
dos.writeBoolean(a);
dos.writeInt(c);
dos.writeChar(d);
dos.close();

5.这是一个字符流,我们指定了outWrite采用ASCII进行编码。"Hello博客园"采用Unicode编码存储在计算机中,writer.write()每次向输出流中写入两个字节(一个字符),"Hello"每个字符从Unicode向ASCII转换,保留低位,仍能正确表示原来字符。而"博客园"每个汉字从Unicode向ASCII转换的时候,则被丢弃一位,不能正确表示,当我们打开被写入的记事本文件的时候,按照GBK进行解码显示输出。

FileOutputStream outStream = new FileOutputStream("D:"+File.separator+"test"+File.separator+"hello.txt");
OutputStreamWriter outWriter = new OutputStreamWriter(outStream,"ASCII");
BufferedWriter writer = new BufferedWriter(outWriter);
writer.write("HEllO博客园");
writer.close();


6.在这里我们将平台的默认字符编码集改为"ISO-8859-1",我们在键盘上敲入数据,这些数据按照GBK进行编码(每个字符站两个字节),我们将么这些字节存放到array中。然后String(array,0,index)采用"ISO-8859-1"(单字节)进行解码,就会出现乱码。

Properties pro = System.getProperties();//获取java虚拟机的系统属性
pro.setProperty("file.encoding", "ISO-8859-1");
int data,index = 0;
byte[] array = new byte[100];
while((data=System.in.read())!='q')
{
array[index] = (byte)data;
index++;
}
String str = new String(array,0,index);
System.out.println(str);

 

posted @ 2011-11-21 23:45  xiao秋  阅读(5277)  评论(0编辑  收藏  举报