小知识点——编码表的使用

在硬盘中,所有文件都可以表示为字节,但是,对于文本文件,还需要把存储的字节信息转化为字符,这就需要通过对照编码表来实现字节与字符之间的转化


对于中文字符,常用的编码表为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);
	}
}

结果:



乱码如期出现









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值