Java判斷文本文件字符編碼的兩種方法:一、經過文件流的前面部分字節判斷;二、經過cpdetector庫提供的監聽方法來判斷。java
public static String codeString(String fileName) throws Exception { BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName)); int p = (bin.read() << 8) + bin.read(); bin.close(); String code = null; switch (p) { case 0xefbb: code = "UTF-8"; break; case 0xfffe: code = "Unicode"; break; case 0xfeff: code = "UTF-16BE"; break; default: code = "GBK"; } return code; }
該方法通常狀況是能夠正常運行的,但對有些文件卻不生效,不能獲取正確的編碼,故而可採起以下方法。編碼
使用Cpdetector jar包檢測文件編碼須要依賴antlr-2.7.4.jar、chardet-1.0.jar、jargs-1.0.jar三個jar包,能夠到官網http://cpdetector.sourceforge.net下載 。spa
詳細的使用能夠參考官網,簡單的代碼示例以下:.net
/** * <div> * 利用第三方開源包cpdetector獲取文件編碼格式.<br/> * --一、cpDetector內置了一些經常使用的探測實現類,這些探測實現類的實例能夠經過add方法加進來, * 如:ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector. <br/> * --二、detector按照「誰最早返回非空的探測結果,就以該結果爲準」的原則. <br/> * --三、cpDetector是基於統計學原理的,不保證徹底正確.<br/> * </div> * @param filePath * @return 返回文件編碼類型:GBK、UTF-八、UTF-16BE、ISO_8859_1 * @throws Exception */ public static String getFileCharset(String filePath) throws Exception { CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); /*ParsingDetector可用於檢查HTML、XML等文件或字符流的編碼, * 構造方法中的參數用於指示是否顯示探測過程的詳細信息,爲false不顯示。 */ detector.add(new ParsingDetector(false)); /*JChardetFacade封裝了由Mozilla組織提供的JChardet,它能夠完成大多數文件的編碼測定。 * 因此,通常有了這個探測器就可知足大多數項目的要求,若是你還不放心,能夠再多加幾個探測器, * 好比下面的ASCIIDetector、UnicodeDetector等。 */ detector.add(JChardetFacade.getInstance()); detector.add(ASCIIDetector.getInstance()); detector.add(UnicodeDetector.getInstance()); Charset charset = null; File file = new File(filePath); try { //charset = detector.detectCodepage(file.toURI().toURL()); InputStream is = new BufferedInputStream(new FileInputStream(filePath)); charset = detector.detectCodepage(is, 8); } catch (Exception e) { e.printStackTrace(); throw e; } String charsetName = "GBK"; if (charset != null) { if (charset.name().equals("US-ASCII")) { charsetName = "ISO_8859_1"; } else if (charset.name().startsWith("UTF")) { charsetName = charset.name();// 例如:UTF-8,UTF-16BE. } } return charsetName; }