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  里面后就变成原文了,这就不懂了请各位高手帮忙下,小弟在此谢过了

解决方案 »

  1.   

    很怀疑,你这样写d:/123.txt应该也是乱码的。不可能不是乱码,不管你之前有没有这个文件,或者还是有这个文件而且还是ANSI编码的,fs.write(string s)java中是采用unicode编码的也就是UTF-8编码的,你这个直接写到d:/123.txt那这个文件就是UTF-8编码的格式。
      

  2.   

    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了)。
      

  3.   

    lz不是新手吧,新手就学这个程序吗?我是新手,正在学HelloWord的……
      

  4.   

    byte[] b=new byte[20];这个数组不会越界的?