java 输出编码_从代码看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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值