如何知道一个文件的编码? 请注意文件头没有任何编码信息的情况下如何知道文件的编码?我发现用记事本打开文件,记事本能自动识别文件的编码,不知道记事是如何做到的??  请注意,文件头绝对没有编码的信息,那些说根据文件的头两个字节来判断的方法是行不通的.
既然记事本能认出来,我想一定有方法可以知道文件的编码,希望高人指点.

解决方案 »

  1.   

      ANSI:          无格式定义;
      Unicode:         前两个字节为FFFE;
      Unicode big endian: 前两字节为FEFF; 
      UTF-8:          前两字节为EFBB; 
      

  2.   

    这种判断大部分可行 但是会有bug 就是记事本也有"联通"的bug 可以看一下张孝祥的 编码部分的课程 讲的还是比较明白的
      

  3.   

    ANSI:             无格式定义; 
        Unicode:              前两个字节为FFFE; 
        Unicode   big   endian: 前两字节为FEFF;  
        UTF-8:               前两字节为EFBB; 
    ==================================
    这个不行,因为我的文件没有这些信息
      

  4.   

            ANSI:                   无格式定义;  
            Unicode:                        前两个字节为FFFE;  
            Unicode       big       endian: 前两字节为FEFF;   
            UTF-8:                         前两字节为EFBB; 
    ==================================
    这个不行,因为我的文件没有这些信息
    文件没有这些信息=>ANSI:                   无格式定义;  
      

  5.   

    帮你顶下!!!
    天气冷了,帮你的女朋友,老婆买件衣服吧:http://shop.paipai.com/312561265
      

  6.   

    IMultiLanguage2 *mlang;
    DetectEncodingInfo info = {0};
    MIMECPINFO codepageinfo;
    int length = 0, cnt = 1;
    String codepagestr; // String Datatype is my class
    unsigned int len =1;if(buffer.GetString())
    length = buffer.GetLength();HRESULT hr = S_OK;
    SUCCEEDED(CoInitialize(NULL)); // init COMhr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, IID_IMultiLanguage2,(void **)&mlang);hr = mlang->DetectInputCodepage(0,0, (wyChar *)buffer.GetString(), &length, &info, &cnt);if(SUCCEEDED(hr))
    {
    hr = mlang->GetCodePageInfo(info.nCodePage, info.nLangID, &codepageinfo);
    if(SUCCEEDED(hr))
    codepage.SetAs(codepageinfo.wszDescription);
    }mlang->Release();
    CoUninitialize();
      

  7.   

    需要判断文件流的前三个字节来判断编码。   
      或者使用   
      StreamReader   sr   =   new   StreamReader("filepath",   true/*detectEncodingFromByteOrderMarks*/);   
      通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字   
      符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码,   
      最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如   
        
      开头字节   Charset/encoding      
      EF   BB   BF   UTF-8   
      FE   FF   UTF-16/UCS-2,   little   endian   
      FF   FE   UTF-16/UCS-2,   big   endian   
      FF   FE   00   00   UTF-32/UCS-4,   little   endian.   
      00   00   FE   FF   UTF-32/UCS-4,   big-endian.
      

  8.   

    8楼给的是什么代码呀,应该不是java的吧?
      

  9.   

    "联通"两个字的ANSI编码最好符合utf-8编码格式所以记事本会把它认为是utf-8格式的文本,所以打开时会乱码. 
    如果字数增加变成"联通联通",由于字数多了,重码的机会更少,就不会发生"误认". 我知道每种编码都有一定格式,根据某些算法基本可以确定字节流的编码. 
      

  10.   

    参考这篇文章:
    http://my.donews.com/sawfish/
      

  11.   

    把文件复制到ECLIPSE中用属性看看...
    不知道楼主是不是这个意思?
      

  12.   

    用UltraEdit的16进制打开文件查看下
      

  13.   

    不好意思一直没来  建议楼住看一下  张孝祥JAVA视频教程高级部分
    中IO流 字符编码那一部分 应该是第7讲  emule 里可以下
      

  14.   

    很负责任的告诉你,如果文件不是全部都非常规范的话,没有一个完美的方法可以知道一个文件是用啥编码来写的
    ================================
    我可以告诉你,只有有足够字节作为样本分析,是可以知道编码的. "联通"问题,只是因为字节太少,所以才会误认为utf-8编码.
      

  15.   


    public BufferedFileReader(String fileName) {
    this.fileName = fileName;
    byte[] head2 = new byte[2];
    head2[0] = 0;
    head2[1] = 0;
    try {
    InputStream in = new FileInputStream(fileName);
    int bytes = 0;
    try {
    bytes = in.read(head2);

    } catch (IOException ioE) {
    }
    if (bytes < 2) {
    in.close();
    bufReader = new BufferedReader(new InputStreamReader(
    new FileInputStream(fileName)));
    needCheckCharset = false;
    } else {
    try {
    if (head2[0] == (byte)0xEF && head2[1] == (byte)0xBB) {
    bufReader = new BufferedReader(new InputStreamReader(
    in, "UTF-8"));
    needCheckCharset = false;
    } else if (head2[0] == (byte)0xFF && head2[1] == (byte)0xFE) {
    bufReader = new BufferedReader(new InputStreamReader(
    in, "UTF-16LE"));
    needCheckCharset = false;
    } else if (head2[0] == (byte)0xFE && head2[1] == (byte)0xFF) {
    bufReader = new BufferedReader(new InputStreamReader(
    in, "UTF-16BE"));
    needCheckCharset = false;
    } else {
    in.close();
    bufReader = new BufferedReader(new InputStreamReader(
    new FileInputStream(fileName)));
    needCheckCharset = true;
    }
    } catch (UnsupportedEncodingException ueE) {
    ueE.printStackTrace();
    }
    }
    } catch (FileNotFoundException fnfE) {
    fnfE.printStackTrace();
    } catch (IOException ioE) {
    ioE.printStackTrace();
    }
    }
      

  16.   

    本来好意,如果某些话刺激了楼主的某根神经,先道歉了,但最后还有一些话
    是要说一下的:1.现实往往是残酷的,你不可能永远有足够的样本空间
    2.足够长的字符串与样本空间不一样,有足够长的也是不一定的,比如重复一万次的“联通”
    3.“联通”不是个例,UTF-8的“汉汉”你用GB2312来解释看看你就知道了
    4.如果一种文字是用一种你不知道的编码写的,恰恰你知道的一种编码又
      解释的通,难道就是你知道的那种编码么?
    5.编码的问题本来就没有那么简单,俺至少也在上面耗了好多年的时间了,你
      能知道的方法永远是尝试的方法,不可能没有一点的错误
    6.如果给我一个支点和一个足够长的杠杆,我也可以支起地球我不会再看这篇帖子,谢谢!
      

  17.   

    to LexChen : 你得看看编码规律的资料. 一般来说有100个字节就足够了. 如果你用记事上打10个汉字以上,出现误认的机率几乎为0了. 事实上有99%能正确分辩已经足够, 总比什么都不知道强.  事实上我们的文件不会只有两个字节,只要字节数有几十个就足够了. 即使只有几个字节,命中率还是很高的.   
      

  18.   

    to   LexChen   :  或许真的没有完全的方法, 即使连windows记事本也不是完美,但能做到记事本的辨认功能已经足够,我现在要探讨的是记事本的实现原理,并不是要完美的办法.