程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .NET自動字符編碼識別程序庫 NChardet

.NET自動字符編碼識別程序庫 NChardet

編輯:.NET實例教程


什麼是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();
http://www.cnblogs.com/hhh/archive/2007/01/27/632251.Html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved