如题。
InputStreamReader isr = new InputStreamReader(new FileInputStream("e:\\test.txt"),"GBK");
//System.err.println(isr.getEncoding());
BufferedReader br = new BufferedReader(isr);比如用上面的代码显示文件内容,如果文件使用的编码是unicode,在控制台打印就是乱码,怎样才能提前获得文件的编码方式然后new一个合适的InputStreamReader呢?

解决方案 »

  1.   

    我给你一个二进制的 .ABC 文件,然后让你把里面的内容读出来,你能猜出它的格式然后正确的把数据读出来吗?应该是不能的。正常情况下,应该是我告诉你这个文件的格式,然后,你才能根据这个格式去解析这个文件。一般而言,一个文本文件的“字符集”(严格说应该是“编码方式,encoding”)也是这个道理。谁给你的这个文本文件,他应该告诉你这个文件的编码方式。当然也有例外。一种例外就是符合一定规范的文件格式。比如 XML 文件,它是“自说明”的,在它的第一个文本行中就有编码方式的说明。再比如 .properties 文件,按要求它应该是 ISO-8859-1 的。还有一种情况,就是说,你可以用程序去“猜”。不同的编码方式都会有一些特征。你把一个文件扫描一遍下来,如果它完全符合某个编码方式的特征,那么你“不妨”认为这个文件就是这种编码方式的。当然这种“猜”不能保证百分之百可靠。
      

  2.   

    我的问题是这样产生的
    前一阵写了一个看TXT的小工具(主要是为了偷偷看闲书),
    结果从网上下的TXT有些是UNICODE的,用小工具打开就是一堆乱码,后来瞎摸索找到了方法可以正确读出GBK和UNICODE的文件了,可因为中毒源代码找不到了又忘了咋写的了。现在想彻底解决这个问题的办法
      

  3.   

    maquan('ma:kju):
    有些文件已经在文件内容里面告诉你它的编码了。
    我就知道,文件开头2字节是FF FE的是Unicode的
      

  4.   

    > 文件开头2字节是FF FE的是Unicode的是有这种情况,但我不知道这只是“MS Windows”的习惯约定,还是有什么国际标准?用 Notepad 可以试出来,FF FE 开头的是“unicode 文件”,FE EF 开头的是“unicode big endian 文件”,EF BB BF 开头的是“utf-8 文件”。
      

  5.   

    Sorry,说错了一点,unicode big endian 是 FE FF 开头的。
      

  6.   

    嗯,同意楼上,记得我以前用VC写过一个读取.txt文件的程序,也是看前4个16进制数据进行判断。
    网上看到一位同仁用c#写的代码,功楼主参考。就是楼上所说的方法
    只是简单的判断文件编码是否为:Unicode UnicodeBIG UTF-8public class EncodingType
    {
    public static System.Text.Encoding GetType(string FILE_NAME)
    {
    FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
    System.Text.Encoding r= GetType(fs);
    fs.Close();
    return r;
    }
    public static System.Text.Encoding GetType(FileStream fs)
    {
    byte[] Unicode=new byte[]{0xFF,0xFE};
    byte[] UnicodeBIG=new byte[]{0xFE,0xFF};
    byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};BinaryReader r = new BinaryReader(fs,System.Text.Encoding.Default);
    byte[] ss=r.ReadBytes(3);
    r.Close();
    //编码类型 Coding=编码类型.ASCII;
    if(ss[0]>=0xEF)
    {
    if(ss[0]==0xEF && ss[1]==0xBB && ss[2]==0xBF)
    {
    return System.Text.Encoding.UTF8;
    }
    else if(ss[0]==0xFE && ss[1]==0xFF)
    {
    return System.Text.Encoding.BigEndianUnicode;
    }
    else if(ss[0]==0xFF && ss[1]==0xFE)
    {
    return System.Text.Encoding.Unicode;
    }
    else
    {
    return System.Text.Encoding.Default;
    }
    }
    else
    {
    return System.Text.Encoding.Default;
    }
    }
    }
      

  7.   

    InputStreamReader.getEncoding() 返回此流使用的字符编码的名称。
    OutputStreamWriter.getEncoding() 返回此流使用的字符编码的名称。
    不知道是不是你想要的! ^_^