對于UTF-8編碼格式的文本文件,其前3個字節(jié)的值就是-17、-69、-65,所以,判定是否是UTF-8編碼格式的代碼片段如下: 1. java.io.File f=new java.io.File("待判定的文本文件名"); 2. try{ 3. java.io.InputStream ios=new java.io.FileInputStream(f); 4. byte[] b=new byte[3]; 5. ios.read(b); 6. ios.close(); 7. if(b[0]==-17&&b[1]==-69&&b[2]==-65) 8. System.out.println(f.getName()+"編碼為UTF-8"); 9. else System.out.println(f.getName()+"可能是GBK"); 10. }catch(Exception e){ 11. e.printStackTrace(); 12. } 可以采用一個現(xiàn)成的開源項目:cpdetector利用該類庫判定文本文件的代碼如下: 1. /*------------------------------------------------------------------------ 2. detector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。 3. cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法 4. 加進(jìn)來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。 5. detector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的 6. 字符集編碼。 7. --------------------------------------------------------------------------*/ 8. cpdetector.io.CodepageDetectorProxy detector = 9. cpdetector.io.CodepageDetectorProxy.getInstance(); 10. /*------------------------------------------------------------------------- 11. ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于 12. 指示是否顯示探測過程的詳細(xì)信息,為false不顯示。 13. ---------------------------------------------------------------------------*/ 14. detector.add(new cpdetector.io.ParsingDetector(false)); 15. /*-------------------------------------------------------------------------- 16. JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼 17. 測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以 18. 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。 19. ---------------------------------------------------------------------------*/ 20. detector.add(cpdetector.io.JChardetFacade.getInstance()); 21. //ASCIIDetector用于ASCII編碼測定 22. detector.add(cpdetector.io.ASCIIDetector.getInstance()); 23. //UnicodeDetector用于Unicode家族編碼的測定 24. detector.add(cpdetector.io.UnicodeDetector.getInstance()); 25. java.nio.charset.Charset charset = null; 26. File f=new File("待測的文本文件名"); 27. try { 28. charset = detector.detectCodepage(f.toURL()); 29. } catch (Exception ex) {ex.printStackTrace();} 30. if(charset!=null){ 31. System.out.println(f.getName()+"編碼是:"+charset.name()); 32. }else 33. System.out.println(f.getName()+"未知"); /*------------------------------------------------------------------------ detector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。 cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法 加進(jìn)來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。 detector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的 字符集編碼。 --------------------------------------------------------------------------*/ cpdetector.io.CodepageDetectorProxy detector = cpdetector.io.CodepageDetectorProxy.getInstance(); /*------------------------------------------------------------------------- ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于 指示是否顯示探測過程的詳細(xì)信息,為false不顯示。 ---------------------------------------------------------------------------*/ detector.add(new cpdetector.io.ParsingDetector(false)); /*-------------------------------------------------------------------------- JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼 測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。 ---------------------------------------------------------------------------*/ detector.add(cpdetector.io.JChardetFacade.getInstance()); //ASCIIDetector用于ASCII編碼測定 detector.add(cpdetector.io.ASCIIDetector.getInstance()); //UnicodeDetector用于Unicode家族編碼的測定 detector.add(cpdetector.io.UnicodeDetector.getInstance()); java.nio.charset.Charset charset = null; File f=new File("待測的文本文件名"); try { charset = detector.detectCodepage(f.toURL()); } catch (Exception ex) {ex.printStackTrace();} if(charset!=null){ System.out.println(f.getName()+"編碼是:"+charset.name()); }else System.out.println(f.getName()+"未知"); 上面代碼中的detector不僅可以用于探測文件的編碼,也可以探測任意輸入的文本流的編碼,方法是調(diào)用其重載形式: Java代碼 復(fù)制代碼 1. charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù)); charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù)); 上面的字節(jié)數(shù)由程序員指定,字節(jié)數(shù)越多,判定越準(zhǔn)確,當(dāng)然時間也花得越長。要注意,字節(jié)數(shù)的指定不能超過文本流的最大長度。 判定文件編碼的具體應(yīng)用舉例: 屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字符串資源。它的內(nèi)容如下所示: Java代碼 復(fù)制代碼 1. #注釋語句 2. 屬性名=屬性值 #注釋語句 屬性名=屬性值 讀入屬性文件的一般方法是: Java代碼 復(fù)制代碼 1. FileInputStream ios=new FileInputStream("屬性文件名"); 2. Properties prop=new Properties(); 3. prop.load(ios); 4. ios.close(); FileInputStream ios=new FileInputStream("屬性文件名"); Properties prop=new Properties(); prop.load(ios); ios.close(); 利用java.io.Properties 的load方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之后就會發(fā)現(xiàn)出現(xiàn)亂碼現(xiàn)象。發(fā)生這個原因是load方法使用字節(jié)流讀入文本,在讀入 后需要將字節(jié)流編碼成為字符串,而它使用的編碼是“iso-8859-1”,這個字符集是ASCII碼字符集,不支持中文編碼,所以這時需要使用顯式的轉(zhuǎn) 碼: Java代碼 復(fù)制代碼 1. String value=prop.getProperty("屬性名"); 2. String encValue=new String(value.getBytes("iso-8859-1"),"屬性文件的實際編碼"); |
|