从代码看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;

2while((data=system.in.read())!=-1)

3{

4system.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);


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值