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