`
dengminhui
  • 浏览: 169892 次
  • 来自: ...
社区版块
存档分类
最新评论

JAVA中自动识别文件编码是UTF8 or GBK

阅读更多

什么是jchardet?

jchardet是mozilla自动字符集探测算法代码的java移植,其源代码可以从sourceforge下载。这个算法的最初作者是 frank Tang,C++源代码在http://www.infomall.cn/cgi-bin/m … ource/intl/chardet/,可以从http://www.infomall.cn/cgi-bin/m … s/intl/chardet.html得到更多关于这个算法的信息。

编译及应用

将下载后的chardet.zip解压缩后,到~/mozilla/intl/chardet/java/目录下,运行ant即可在dist/lib目录下生成chardet.jar,将这个jar包加入CLASSPATH.然后
运行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://hedong.3322.org
结果:CHARSET = GB18030
运行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://www.wesnapcity.com/
结果:CHARSET = ASCII
运行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://www.wesnapcity.com/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为一个整数,用以提示语言线索,可以提供的语言线索有以下几个:
*

1. Japanese
2. Chinese
3. Simplified Chinese
4. Traditional Chinese
5. Korean
6. 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( (len=imp.read(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[] = det.getProbableCharsets() ;
for(int i=0; i   System.out.println(”Probable Charset = ” + prob);
}
}

jchardet主要解决什么样的问题?

Java字符串(及字符)类以Unicode编码保存数据。当处理来自外部的国际性文本时,我们需要提供关于这些文本的编码,以便准确地将它们转换为Unicode。这意味着你必须知道你的java代码要处理的所有文件的编码。许多基于Internet的Java应用程序,要处理来自随机数据源的数据,而很多数据的编码不能确切的知道。例如,一个HTML页面中的数据,如果没有元数据标签明确地指定页面的字符集,就很难确实其编码,将其转换为 Java Unicode字符串时也会误用而终止。

这个算法是如何工作的?

浏览器处理这个问题的方法,是对数据一个字节一个字节的检查,以力图测试字符集(当你点击菜单View->Auto-select或 auto-detect时)。这个算法(最初由Frank Tang开发)检查字节序列,基于每个字节的值,利用逐步消除法(elimination logic)逐步缩小以至最后确定字符集。如果这个方法仍难以确定,就利用另一个方法,根据某种语言的字符的频次统计来确实字符集。

下载地址:http://jchardet.sourceforge.net
转载地址:http://www.w18.net/viewthread.php?tid=125
分享到:
评论

相关推荐

    java获取文件编码(判断有无BOM)

    BOM是UTF-8、UTF-16和UTF-32等编码格式中的一个可选标记,用于告知解析器文件的编码类型。例如,UTF-8的BOM是三个字节(0xEF, 0xBB, 0xBF),而UTF-16LE和UTF-16BE的BOM分别是两个字节(0xFF, 0xFE)和(0xFE, 0xFF...

    LJParser文本搜索与挖掘开发平台

    正式版本可以支持UTF-8编码; 3. 各种dll为各组件的调用接口,本演示程序全部基于已有的调用接口实现; 4. 文档说明,参见当前目录下的 5. 白皮书下载:http://www.lingjoin.com/download/LJParser%20Manual.doc 6. ...

    MySQL插入数据中错误提醒 1366 Incorrect string value…的解决方法

    在Windows环境中,安装MySQL时如果选择了默认的GBK编码,而实际操作中需要用到UTF-8编码的字符,就会引发这种问题。 **1. 错误原因分析** GBK是一种双字节编码,主要支持简体中文,而UTF-8则是一种多字节编码,能...

    oracle乱码?号改成中文 +环境配置

    - 如果以上方法都无法解决问题,可以考虑将数据库中的所有字符字段改为Unicode编码(如UTF-8),这样可以最大程度地避免字符集不兼容导致的问题。 #### 四、总结 通过上述方法,可以有效地解决Oracle数据库中出现...

    经典Python面试题之Python基础篇.docx

    - **UTF-8**: Unicode 的一种编码方式,可变长度,兼容 ASCII。 - **GBK**: 中文编码标准,主要用于简体中文。 #### 14. 字节码和机器码的区别? - **字节码**: Python 编译后的中间代码,可以跨平台运行。 - **...

Global site tag (gtag.js) - Google Analytics