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

jchardet是一款用于自动识别文件编码(如UTF-8或GBK)的Java库,它是mozilla字符集探测算法的Java移植版。该工具适用于处理未知编码的文本数据,通过逐步消除法来确定最可能的编码格式。
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)逐步缩小以至最后确定字符集。如果这个方法仍难以确定,就利用另一个方法,根据某种语言的字符的频次统计来确实字符集。


[color=red]转载地址:http://www.w18.net/viewthread.php?tid=125[/color]
* Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. * Exception is: java.lang.RuntimeException: org.gradle.api.internal.catalog.GeneratedClassCompilationException: Unable to compile generated sources: - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xF2) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xC8) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xDC) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x8A) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x92) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xE584) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xDF) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x93) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x95) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xD3) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x87) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x98) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xD1) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xFD) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xE8) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xEE) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xEE) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xA4) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xE7) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x94) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xE3A2) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xCE) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xBA) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0x87) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xEB) - File LibrariesForLibs.java, line: 1, 编码 UTF-8 的不可映射字符 (0xA4) - F
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值