Java獲取文本文件字符編碼的兩種方法

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庫

使用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;
	}
相關文章
相關標籤/搜索