您的位置:首页 > 编程语言 > Java开发

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

2012-01-10 01:49 225 查看
在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^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: