什麼是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();