日期:2014-05-20  浏览次数:20571 次

刚学Java不久,想请教一个小小问题!
import java.io.*;
public class TestEncode_1 {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
  FileInputStream f1=new FileInputStream("c:/123.txt");
  FileWriter fw=new FileWriter("d:/123.txt");
  byte[] b=new byte[20];
  f1.read(b);
  String s=new String(b,"GBK"); //s的内容为 锘縅ava绋嬪簭璁捐鏁欑▼
  fw.write(s); //最后d:/123.txt 的内容为 Java程序设计教程  
  fw.close();
}
}
"c:/123.txt"是一个utf-8编码的文件,而"d:/123.txt"则是一个ANSI编码的文件,得到的s理所当然是乱码啦,
但将乱码s写进 d:/123.txt 里面后就变成原文了,这就不懂了。。。请各位高手帮忙下,小弟在此谢过了。。。

------解决方案--------------------
很怀疑,你这样写d:/123.txt应该也是乱码的。不可能不是乱码,不管你之前有没有这个文件,或者还是有这个文件而且还是ANSI编码的,fs.write(string s)java中是采用unicode编码的也就是UTF-8编码的,你这个直接写到d:/123.txt那这个文件就是UTF-8编码的格式。
------解决方案--------------------
utf-8编码是3个字节表示一个汉字,ANSI和GBK都是2个字节表示一个汉字,所以打印出来的S是乱码(这里跟d:/123.txt没有关系);为什么写到d:/123.txt里面又是正常的呢?这是因为微软的UTF-8编码的时候会在开始处加上EF BB BF用于识别是否为UTF-8,所以你C:/123.txt读过来的带有EF BB BF,写到d:/123.txt的时候依然有,它会重新解析为UTF-8(不信你看看d:/123.txt的编码格式已经变成了UTF-8不是ANSI了)。