Blogger Scott

          自動檢測TXT文件編碼

          自動檢測文本文件編碼的代碼(只能簡單判斷是UTF-8或不是UTF-8),因為一般除了UTF-8之外就是GBK,所以就設置默認為GBK。

          String charsetDetect(String path) {
              String _charset="";
              try {
               File file = new File(path);
               InputStream fs = new FileInputStream(file);
               byte[] buffer = new byte[3];
               fs.read(buffer);
                fs.close();
           
            if (buffer[0] == -17 && buffer[1] == -69 && buffer[2] == -65)
              _charset="UTF-8";
            else
              _charset="GBK";
               }
               catch (IOException e) {e.printStackTrace(); }
               return _charset;

             }

          若想實現(xiàn)更復雜的文件編碼檢測,可以使用一個開源項目cpdetector,它所在的網(wǎng)址是:http://cpdetector.sourceforge.net/。它的類庫很小,只有500K左右,利用該類庫判定文本文件的代碼如下:

          /*------------------------------------------------------------------------ 
            detector是探測器,它把探測任務交給具體的探測實現(xiàn)類的實例完成。 
            cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法 
            加進來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。   
            detector按照“誰最先返回非空的探測結果,就以該結果為準”的原則返回探測到的 
            字符集編碼。 
          --------------------------------------------------------------------------*/ 
          cpdetector.io.CodepageDetectorProxy detector =  
          cpdetector.io.CodepageDetectorProxy.getInstance();  
          /*------------------------------------------------------------------------- 
            ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構造方法中的參數(shù)用于 
            指示是否顯示探測過程的詳細信息,為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是探測器,它把探測任務交給具體的探測實現(xiàn)類的實例完成。
              cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法
              加進來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。 
              detector按照“誰最先返回非空的探測結果,就以該結果為準”的原則返回探測到的
              字符集編碼。
            --------------------------------------------------------------------------*/
            cpdetector.io.CodepageDetectorProxy detector =
            cpdetector.io.CodepageDetectorProxy.getInstance();
            /*-------------------------------------------------------------------------
              ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構造方法中的參數(shù)用于
              指示是否顯示探測過程的詳細信息,為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代碼
          charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù)); 

           charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù));

          上面的字節(jié)數(shù)由程序員指定,字節(jié)數(shù)越多,判定越準確,當然時間也花得越長。要注意,字節(jié)數(shù)的指定不能超過文本流的最大長度。

            判定文件編碼的具體應用舉例:
            屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字符串資源。它的內(nèi)容如下所示:
            Java代碼
          #注釋語句  
          屬性名=屬性值  

             #注釋語句
             屬性名=屬性值
           
            讀入屬性文件的一般方法是:
            Java代碼
          FileInputStream ios=new FileInputStream("屬性文件名");  
          Properties prop=new Properties();  
          prop.load(ios);  
          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碼字符集,不支持中文編碼,所以這時需要使用顯式的轉碼:
          Java代碼
          String value=prop.getProperty("屬性名");  
          String encValue=new String(value.getBytes("iso-8859-1"),"屬性文件的實際編碼");  

             String value=prop.getProperty("屬性名");
             String encValue=new String(value.getBytes("iso-8859-1"),"屬性文件的實際編碼");
           
            在上面的代碼中,屬性文件的實際編碼就可以利用上面的方法獲得。當然,象這種屬性文件是項目內(nèi)部的,我們可以控制屬性文件的編碼格式,比如約定采用Windows內(nèi)定的GBK,就直接利用"gbk"來轉碼,如果約定采用UTF-8,也可以是使用"UTF-8"直接轉碼。如果想靈活一些,做到自動探測編碼,就可利用上面介紹的方法測定屬性文件的編碼,從而方便開發(fā)人員的工作。

           

          posted on 2009-06-03 21:36 江天部落格 閱讀(6015) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 象州县| 瑞丽市| 凭祥市| 阿拉善左旗| 青海省| 井陉县| 昌吉市| 沛县| 依安县| 娱乐| 枞阳县| 当雄县| 逊克县| 屏山县| 宁强县| 阿克苏市| 和顺县| 永康市| 固始县| 内黄县| 谷城县| 文登市| 威海市| 洮南市| 洞头县| 海盐县| 绥芬河市| 伊金霍洛旗| 烟台市| 耒阳市| 田阳县| 开化县| 安国市| 南召县| 汽车| 永川市| 辽阳市| 翁源县| 诏安县| 蒲江县| 军事|