.NET自動字元編碼識別程式庫 NChardet

來源:互聯網
上載者:User
編碼|程式

  什麼是NChardet

     NChardet是mozilla自動字元編碼識別程式庫chardet的.NET實現,它移植自jchardet,chardet的java版實現,可實現對給定字元流的編碼探測。

 NChardet是如何工作的

     NChardet通過逐個比較輸入字元來猜測編碼;由於是猜測,所以可能會有不能完全識別的情況;如果輸入字元不能確定正確的編碼,那麼NChardet會給出一組可能的編碼值。

 如何使用NChardet

    要使用NChardet來探測編碼,需要進行如下步驟。

    1、使用制定的語言線索來構造Detector類的執行個體對象。
    2、用實現了ICharsetDetectionObserver介面的對象作為參數來調用Detector類的Init方法。
    3、傳入要探測的字元流進行編碼探測。
    4、調用Detector類的DataEnd方法。
    5、得到結果或可能的結果集。

    語言線索是一個整數,可用的語言線索有如下幾個:

         1.    Japanese
         2.    Chinese
         3.    Simplified Chinese
         4.    Traditional Chinese
         5.    Korean
         6.    Dont know (預設)


    ICharsetDetectionObserver介面只有一個Notify方法,當NChardet引擎認為自己已經探測出正確的編碼時,它就會調用這個Notify方法,使用者程式可以從這個Nodify方法中得到通知(重寫ICharsetDetectionObserver介面的Notify實現)。

代碼執行個體:


 //實現ICharsetDetectionObserver介面
    public class MyCharsetDetectionObserver :
        NChardet.ICharsetDetectionObserver
    {
        public string Charset = null;
       
        public void Notify(string charset)
        {
            Charset = charset;
        }
    }

        int lang = 2 ;//
    //用指定的語參數執行個體化Detector
        Detector det = new Detector(lang) ;
    //初始化
        MyCharsetDetectionObserver cdo = new MyCharsetDetectionObserver();
        det.Init(cdo);

    //輸入字元流
    Uri url = new Uri(“http://cn.yahoo.com”);
    HttpWebRequest request =
        HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse response =
        (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream();
   
    byte[] buf = new byte[1024] ;
    int len;
    bool done = false ;
    bool isAscii = true ;

    while( (len=stream.Read(buf,0,buf.Length)) != 0) {
        // 探測是否為Ascii編碼
        if (isAscii)
            isAscii = det.isAscii(buf,len);

        // 如果不是Ascii編碼,並且編碼未確定,則繼續探測
        if (!isAscii && !done)
                done = det.DoIt(buf,len, false);

    }
    stream.Close();
    stream.Dispose();
    //調用DatEnd方法,
    //如果引擎認為已經探測出了正確的編碼,
//則會在此時調用ICharsetDetectionObserver的Notify方法
    det.DataEnd();

    if (isAscii) {
        Console.WriteLine("CHARSET = ASCII");
          found = true ;
    }
    else if (cdo.Charset != null)
    {
        Console.WriteLine("CHARSET = {0}",cdo.Charset);
        found = true;
    }
   
    if (!found) {
        string[] prob = det.getProbableCharsets() ;
        for(int i=0; i<prob.Length; i++) {
            Console.WriteLine("Probable Charset = " + prob[i]);
        }
    }
    Console.ReadLine();



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。