大部分情况下,输入文件的字符集编码都是明确的,但是有时也会有文件编码不确定的情况,这时候我们就需要通过代码来判断文件的字符集。
我也在网上找了一些代码,但是都判断的不是很准确,后来找到了cpdetector.jar,使用这个jar能够很好的判断文件的字符集,代码如下:
package com.xxx.utils; public class FileUtil { /** * 判断文件的编码格式 * @param fileName :file * @return 文件编码格式 * @throws Exception */ public static String codeString(String fileName){ String code = "unKnown"; /*------------------------------------------------------------------------ detector是探测器,它把探测任务交给具体的探测实现类的实例完成。 cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。 detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的 字符集编码。 --------------------------------------------------------------------------*/ CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); /*------------------------------------------------------------------------- ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于 指示是否显示探测过程的详细信息,为false不显示。 ---------------------------------------------------------------------------*/ detector.add(new ParsingDetector(false));//如果不希望判断xml的encoding,而是要判断该xml文件的编码,则可以注释掉 /*-------------------------------------------------------------------------- JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。 ---------------------------------------------------------------------------*/ detector.add(JChardetFacade.getInstance()); // ASCIIDetector用于ASCII编码测定 detector.add(ASCIIDetector.getInstance()); // UnicodeDetector用于Unicode家族编码的测定 detector.add(UnicodeDetector.getInstance()); Charset charset = null; File f = new File(fileName); try { charset = detector.detectCodepage(f.toURL()); } catch (Exception ex) { ex.printStackTrace(); } if (charset != null) { code = charset.name(); } if("GB2312".equals(code) || "gb2312".equals(code)) { //这里是因为发现jar会把gbk判断成gb2312,由于gb2312是gbk的子集,所以使用gb2312可能会有乱码,这里统一使用gbk code = "GBK"; } return code; } }
此链接为cpdetector所需要的3个jar的下载链接,里面包含:antlr-1.0.jar、cpdetector-1.08.jar、jchadet-1.0.jar