.NET自动字符编码识别程序库 NChardet
什么是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实现)。
代码实例:
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();
获得NChardet
NChardet Library (.NET 1.1 and .NET 2.0 ,DLL)
NChardet Source Code (开发环境为SharpDevelop 2.0)
版权说明
本程序移植自jchardet,版权说明请参照jchardet,C#代码采用BSD授权。
相关链接
mozilla chardet http://www.mozilla.org/projects/intl/chardet.html
mozilla chardet 下载 http://lxr.mozilla.org/mozilla/source/intl/chardet/
jchardet http://jchardet.sourceforge.net/
SharpDevelop http://www.icsharpcode.net/OpenSource/SD/
字符集编码的自动识别jchardet http://hedong.3322.org/archives/000361.html
http://www.cnblogs.com/hhh/archive/2007/01/27/632251.html
.NET自动字符编码识别程序库 NChardet的更多相关文章
- C语言字符编码处理
一.字符编码识别 1.简介 uchardet是一个开源的用于文本编码检测的C语言库,其功能模块是用C++实现的,通过一定数量的字符样本独立的分析出文本的编码,当前已经支持UTF-8/GB13080/B ...
- hibernate自动建表采用UTF-8字符编码
hibernate自动建表采用UTF-8字符编码 hibernate建表默认为UTF-8编码 >>>>>>>>>>>>>& ...
- fedora23深度配置gnome系统环境, 如设置ibus的面板字体大小 以及gedit 自动探测文件字符编码fileencodings
除了系统桌面gnome, 以及gnome应用程序自带的preferences, 还有很多设置, 没有在preferences, 而是被深度地隐藏在系统中, 这时, 需要安装 dconf-tools: ...
- 字符编码-UNICODE,GBK,UTF-8区别【转转】
字符编码介绍及不同编码区别 今天看到这篇关于字符编码的文章,抑制不住喜悦(总结的好详细)所以转到这里来.转自:祥龙之子http://www.cnblogs.com/cy163/archive/2007 ...
- Linux 下查看文件字符编码和转换编码
Linux 下查看文件字符编码和转换编码 如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linu ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
转自: http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不 ...
- 第六节,初识python和字符编码
程序语言的发展 机器语言 程序语言,最初的计算机语言是机器语言,完全是0和1组成的二进制串 如:01010101 11010101 汇编语言 因为01010101的字符串,冗长,不利于维护,所以产生 ...
- 转 :Vim文件编码识别与乱码处理
Vim文件编码识别与乱码处理 在 Vim 中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding 和 termencoding.在实际使用中,任 ...
随机推荐
- 用JUNCTION映射文件夹内容 解决多系统跑同一个虚拟机而共享文件夹路径不同的问题
事情由来: 某机器安装了俩系统,WIN7X64用来玩PC游戏,WIN2012R2用来工作,系统分别在两个不同的分区,但进入到系统后,两个系统的系统盘都是C盘.换句话说,在WIN7里,分区1是C盘,分区 ...
- FastMM内存泄露
转自:http://www.2ccc.com/article.asp?articleid=4879FastMM是非常优秀的内存管理器,但是从FastMM4Options.inc中找到合适自已程序的选项 ...
- Linux企业级项目实践之网络爬虫(18)——队列处理
所有的URL都接受管理,并在此进行流动.URL从管理模块的存储空间开始,一直到最后输出给磁盘上的URL索引,都由此部分调度.首先,给出URL调度的一般过程,如图所示.其流程的各个具体操作,后面详述.要 ...
- WPF - Build Error总结
1. are you missing an assembly reference 给项目添加新控件的时候,经常发现这种错误 Error 21 The type or namespace name 'C ...
- iOS 原生二维码扫描,带扫描框和扫描过程动画
在代码中使用了相对布局框架Masonry 准备两张图片,一张是扫描边框,一张是扫描时的细线分别命名 scanFrame.png和scanLine.png并提前放入工程 导入相对布局头文件 #defin ...
- #python基础学习模块:marshal 对象的序列化
#标准库地址:https://docs.python.org/2/library/marshal.html"""有时候,要把内存中一个对象持久化保存磁盘或者序列化二进制流 ...
- 几道php基础面试题
前言 昨晚实验室一师弟在微薄上@我,给我发了几道php的基础面试题,这里把我写的答案贴出来 题目 (1)写一个函数获取URL的文件后缀,例如“http://www.feiyan.info/test.p ...
- Network 20Q--Q2 How does Google sell ad spaces?
在使用Google搜索的时候会发现,搜索出来的页面除了在左边显示搜索结果以外,还会页面的右边推荐一些广告.那么Google是怎么从这些广告挣钱以及广告商可以通过Google广告获得什么利益呢? Goo ...
- HDOJ 4937 Lucky Number
当进制转换后所剩下的为数较少时(2位.3位),相应的base都比較大.能够用数学的方法计算出来. 预处理掉转换后位数为3位后,base就小于n的3次方了,能够暴力计算. . .. Lucky Numb ...
- Ubuntu中设置静态IP和DNS(转载)
原文地址:http://blog.sina.com.cn/s/blog_669421480102v3bb.html VMware 中使用网络,对虚拟机设置静态IP:在Ubuntu中设置静态IP共两步: ...