黑马程序员技术交流社区

标题: 怎样判断一个文本文件是属于什么格式的? [打印本页]

作者: 祁焱    时间: 2011-10-27 00:12
标题: 怎样判断一个文本文件是属于什么格式的?
怎样利用java判断一个文本文件是属于什么编码格式的,例如是UTF—8还是ANCI。


该贴已经同步到 祁焱的微博
作者: 杨强    时间: 2011-10-27 00:28
用记事本打开,然后点“另存为”,看看下面默认的编码,如果是utf-8 ,那就是utf-8,如果是ansi,那就是gbk了

作者: 宁超    时间: 2011-10-27 08:44
有现成的开源项目。cpdetector。你可以下载了研究下。
作者: 孙运强    时间: 2011-10-27 09:04

FileRead 有个public String getEncoding()返回此流使用的字符编码的名称。你可以试试,
刚开始我也没有找到,都想到通过二进制找区别来判断了。看了下字符编码之间的区别
从中看到了可以从FileRead中找。累了我一小时。
作者: 黄健    时间: 2011-10-27 09:13
/*在网上搜索到的*/

在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于BIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式;而在读取这些文本文件时,有时候就需要自动判定文件的编码格式。
    按照给定的字符集存储文本文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。

    对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:

    测试文件编码是否为UTF-8

           File file = new File(path);

           InputStream ios = new java.io.FileInputStream(file);

           byte[] b = new byte[3];

           ios.read(b);

           ios.close();

           if (b[0] == -17 && b[1] == -69 && b[2] == -65)

               System.out.println(file.getName() + “:编码为UTF-8″);

           else

               System.out.println(file.getName() + “:可能是GBK,也可能是其他编码。”);

    上述代码只是简单判定了是否是UTF-8格式编码的文本文件,如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:http://www.oschina.net/p/cpdetector。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下:

    FileEncodeDetector

    package cn.edu.cqu.tiger;

    import info.monitorenter.cpdetector.io.ASCIIDetector;

    import info.monitorenter.cpdetector.io.CodepageDetectorProxy;

    import info.monitorenter.cpdetector.io.JChardetFacade;

    import info.monitorenter.cpdetector.io.ParsingDetector;

    import info.monitorenter.cpdetector.io.UnicodeDetector;

    import java.io.BufferedReader;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    public class FileEncodeDetector {

        public static String getFileEncode(String path) {

           /*------------------------------------------------------------------------

             detector是探测器,它把探测任务交给具体的探测实现类的实例完成。

             cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法

             加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。

             detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的

             字符集编码。

              使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar

              cpDetector是基于统计学原理的,不保证完全正确。

           --------------------------------------------------------------------------*/

           CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

           /*-------------------------------------------------------------------------

             ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于

             指示是否显示探测过程的详细信息,为false不显示。

           ---------------------------------------------------------------------------*/

           detector.add(new ParsingDetector(false));


作者: 陆华山    时间: 2011-10-27 09:33
使用   
  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.
作者: 陆华山    时间: 2011-10-27 09:34
使用   
  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.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2