Java多语言编码问题解析

Java 编码 :字符串变成字节数组 ,String --> byte[] ,str.getBytes(charsetName);

Java 解码 :字节数组变成字符串 , byte[]--> String ,new String(byte[],charsetName);

I/O 操作中存在的编码

我们知道涉及到编码的地方一般都在字符到字节或者字节到字符的转换上,而需要这种转换的场景主要是在 I/O 的时候,这个 I/O 包括磁盘 I/O 和网络 I/O。下图是 Java 中处理 I/O 问题的接口:


Figure xxx. Requires a heading 

Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。

写的情况也是类似,字符的父类是 Writer,字节的父类是 OutputStream,通过 OutputStreamWriter 转换字符到字节。如下图所示:


Figure xxx. Requires a heading 

同样 StreamEncoder 类负责将字符编码成字节,编码格式和默认编码规则与解码是一致的。

但如果编码时有指定特定的编码格式,那解码格式也应要相同。

package javase.day18;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class EncodeStream {

	public static void main(String[] args) {
		writeText();
		readText();
	}
	//编码
	public static void writeText(){
		try {
			OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\java_test\\GBK.txt"),"GBK");
			osw.write("你好啊");//文件大小为6字节
			osw.close();
			
			
			OutputStreamWriter osw2=new OutputStreamWriter(new FileOutputStream("C:\\java_test\\UTF8.txt"),"UTF-8");
			osw2.write("你好啊");//文件大小为9字节
			osw2.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	//解码
	public static void readText(){
		try {
			InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\java_test\\GBK.txt"),"GBK");//如果charset为UTF-8则会输出乱码
			char[] buf = new char[10];
			int len = isr.read(buf);
			String str= new String(buf,0,len);
			System.out.println(str);//控制台输出“你好啊”
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

参考文章:

http://www.enet.com.cn/article/2007/1030/A20071030887842.shtml

http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值