通过jchardet⾃动识别字符编码格式
什么是jchardet?
jchardet是mozilla⾃动字符集探测算法代码的java移植,其源代码可以从sourceforge下载。这个算法的最初作者是frank Tang,C++源代码在www.infomall/cgi-
bin/mallgate/20040514//mozilla/source/intl/chardet/,可以从www.infomall/cgi-bin/mallgate/20040514//projects/intl/chardet.html得到更多关于这个算法的信息。
编译及应⽤
  将下载后的chardet.zip解压缩后,到~/mozilla/intl/chardet/java/⽬录下,运⾏ant即可在dist/lib⽬录下⽣成chardet.jar,将这个jar包加⼊CLASSPATH.然后
运⾏:illa.intl.chardet.HtmlCharsetDetector
java语言使用的字符码集是
结果:CHARSET = GB18030
运⾏:illa.intl.chardet.HtmlCharsetDetector www.wesnapcity/
结果:CHARSET = ASCII
运⾏:illa.intl.chardet.HtmlCharsetDetector www.wesnapcity/blog/
结果:CHARSET = UTF-8
编程使⽤
  下⾯就jchardet.jar中的HtmlCharsetDetector.java,对调⽤jchardet过程予以说明:
//实现nsICharsetDetectionObserver接⼝,这个接⼝只有⼀个Notify()⽅法.当jchardet引擎⾃⼰认为已经识别出字符串的字符集后(不论识别的对错),都会调⽤这个Notify⽅法。
nsICharsetDetectionObserver cdo=new nsICharsetDetectionObserver() {
public void Notify(String charset) {
HtmlCharsetDetector.found = true ;
System.out.println("CHARSET = " + charset);
}
};
/**
* 初始化nsDetector()
*lang为⼀个整数,⽤以提⽰语⾔线索,可以提供的语⾔线索有以下⼏个:
*
Japanese
Chinese
Simplified Chinese
Traditional Chinese
Korean
Dont know (默认)
*/
nsDetector det = new nsDetector(lang) ;
// 设置⼀个Oberver
det.Init(cdo);
BufferedInputStream imp = new BufferedInputStream(url.openStream());
byte[] buf = new byte[1024] ;
boolean done = false ; //是否已经确定某种字符集
boolean isAscii = true ;//假定当前的串是ASCII编码
while( (ad(buf,0,buf.length)) != -1) {
// 检查是不是全是ascii字符,当有⼀个字符不是ASC编码时,则所有的数据即不是ASCII编码了。
if (isAscii) isAscii = det.isAscii(buf,len);
/
/ 如果不是ascii字符,则调⽤DoIt⽅法.
if (!isAscii && !done) done = det.DoIt(buf,len, false);//如果不是ASCII,⼜还没确定编码集,则继续检测。
}
det.DataEnd();//最后要调⽤此⽅法,此时,Notify被调⽤。
if (isAscii) {
System.out.println("CHARSET = ASCII");
found = true ;
}
if (!found) {//如果没到,则到最可能的那些字符集
String prob[] = ProbableCharsets() ;
for(int i=0; i System.out.println("Probable Charset = " + prob[i]);
}
}
jchardet主要解决什么样的问题?
  Java字符串(及字符)类以Unicode编码保存数据。当处理来⾃外部的国际性⽂本时,我们需要提供关于这些⽂本的编码,以便准确地将它们转换为Unicode。这意味着你必须知道你的java代码要处理的所有⽂件的编码。许多基于Internet的Java应⽤程序,要处理来⾃随机数据源的数据,⽽很多数据的编码不能确切的知道。例如,⼀个HTML页⾯中的数据,如果没有元数据标签明确地指定页⾯的字符集,就很难确实其编码,将其转换为Java Unicode字符串时也会误⽤⽽终⽌。
这个算法是如何⼯作的?
  浏览器处理这个问题的⽅法,是对数据⼀个字节⼀个字节的检查,以⼒图测试字符集(当你点击菜单View->Auto-select或auto-detect时)。这个算法(最初由Frank Tang开发)检查字节序列,基于每个字节的值,利⽤逐步消除法(elimination logic)逐步缩⼩以⾄最后确定字符集。如果这个⽅法仍难以确定,就利⽤另⼀个⽅法,根据某种语⾔的字符的频次统计来确实字符集。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。