什么是jchardet?
jchardet是mozilla自动字符集探测算法代码的java移植,其源代码可以从sourceforge下载。这个算法的最初作者是frank Tang,C++源代码在http://www.infomall.cn/cgi-bin/mallgate/20040514/http://lxr.mozilla.org/mozilla/source/intl/chardet/,可以从http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.mozilla.org/projects/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为一个整数,用以提示语言线索,可以提供的语言线索有以下几个:
*
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( (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[i]);
}
}
使用方法如下
//使用 jchardet 获得文件编码 -javacode
//当含中文的文件用ANSI编码保存时,检测还是出错。
package org.mozilla.intl.chardet;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 借助JCharDet获取文件字符集
* @author icer
* PS:
* JCharDet 是mozilla自动字符集探测算法代码的java移植,其官方主页为:
* http://jchardet.sourceforge.net/
* @date 2008/11/13
*/
public class FileCharsetDetector {
private boolean found = false;
/**
* 如果完全匹配某个字符集检测算法, 则该属性保存该字符集的名称. 否则(如二进制文件)其值就为默认值 null, 这时应当查询属性
*/
private String encoding = null;
public static void main(String[] argv) throws Exception {
if (argv.length != 1 && argv.length != 2) {
System.out
.println("Usage: FileCharsetDetector <path> [<languageHint>]");
System.out.println("");
System.out.println("Where <path> is d:/demo.txt");
System.out.println("For optional <languageHint>. Use following...");
System.out.println(" 1 => Japanese");
System.out.println(" 2 => Chinese");
System.out.println(" 3 => Simplified Chinese");
System.out.println(" 4 => Traditional Chinese");
System.out.println(" 5 => Korean");
System.out.println(" 6 => Dont know (default)");
return;
} else {
String encoding = null;
if (argv.length == 2) {
encoding = new FileCharsetDetector().guestFileEncoding(argv[0],
Integer.valueOf(argv[1]));
} else {
encoding = new FileCharsetDetector().guestFileEncoding(argv[0]);
}
System.out.println("文件编码:" + encoding);
}
}
/**
* 传入一个文件(File)对象,检查文件编码
*
* @param file
* File对象实例
* @return 文件编码,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(File file) throws FileNotFoundException,
IOException {
return geestFileEncoding(file, new nsDetector());
}
/**
* 获取文件的编码
*
* @param file
* File对象实例
* @param languageHint
* 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
* 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
* @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(File file, int languageHint)
throws FileNotFoundException, IOException {
return geestFileEncoding(file, new nsDetector(languageHint));
}
/**
* 获取文件的编码
*
* @param path
* 文件路径
* @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(String path) throws FileNotFoundException,
IOException {
return guestFileEncoding(new File(path));
}
/**
* 获取文件的编码
*
* @param path
* 文件路径
* @param languageHint
* 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
* 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public String guestFileEncoding(String path, int languageHint)
throws FileNotFoundException, IOException {
return guestFileEncoding(new File(path), languageHint);
}
/**
* 获取文件的编码
*
* @param file
* @param det
* @return
* @throws FileNotFoundException
* @throws IOException
*/
private String geestFileEncoding(File file, nsDetector det)
throws FileNotFoundException, IOException {
// Set an observer...
// The Notify() will be called when a matching charset is found.
det.Init(new nsICharsetDetectionObserver() {
public void Notify(String charset) {
found = true;
encoding = charset;
}
});
BufferedInputStream imp = new BufferedInputStream(new FileInputStream(
file));
byte[] buf = new byte[1024];
int len;
boolean done = false;
boolean isAscii = true;
while ((len = imp.read(buf, 0, buf.length)) != -1) {
// Check if the stream is only ascii.
if (isAscii)
isAscii = det.isAscii(buf, len);
// DoIt if non-ascii and not done yet.
if (!isAscii && !done)
done = det.DoIt(buf, len, false);
}
det.DataEnd();
if (isAscii) {
encoding = "ASCII";
found = true;
}
if (!found) {
String prob[] = det.getProbableCharsets();
if (prob.length > 0) {
// 在没有发现情况下,则取第一个可能的编码
encoding = prob[0];
} else {
return null;
}
}
return encoding;
}
}
分享到:
相关推荐
jchardet-1.1 字符编码识别jchardet-1.1 字符编码识jchardet是mozilla自动字Java字符串(及字符)类以Unicode编码保存数据。当处理来自外部的国际性文本时,我们需要提供关于这些文本的编码,以便准确地将它们转换为...
jchardet-1.1 字符编码识别jchardet-1.1 字符编码识jchardet是mozilla自动字Java字符串(及字符)类以Unicode编码保存数据。当处理来自外部的国际性文本时,我们需要提供关于这些文本的编码,以便准确地将它们转换为...
常见的编码识别算法有`JChardet`(源自Firefox的`CharsetDetector`)、`ICU4J`库的`BreakIterator`等。 `BytesEncodingDetect.java`可能实现了一个简单的字节模式匹配过程,例如通过查找常见的BOM(Byte Order Mark)...
jchardet是一个基于Mozilla自动字符集探测算法的Java移植版,最初由Frank Tang开发,后来被移植到Java。这个库可以极大地帮助Java开发者解决编码识别问题。要使用jchardet,首先需要将其引入到项目中。然后,需要...
该项目包含了多种探测器,如ParsingDetector、JChardetFacade、ASCIIDetector和UnicodeDetector等,它们各自负责不同类型的编码识别。以下是如何使用cpdetector库进行编码检测的示例代码: ```java cpdetector.io....
最后,`jchardet-1.0.jar` 是一个字符集检测库,它是基于Mozilla的jChardet项目,其核心是基于Mozilla的CharDet算法。这个算法是通过统计语言模型和字节序列的特征来检测文件的编码。jChardet在处理Unicode编码和非...
cpdetector是Java编程语言中的一个实用工具,它结合了jchardet库,提供了一种高效、准确的方式来检测文件或流的字符集。 **cpdetector库详解:** cpdetector库是专门为Java开发的,其主要功能是自动识别文本文件的...
这个工具可能包含了各种编码识别算法,帮助我们准确地识别出文件的编码。使用这类工具通常涉及以下步骤: 1. **读取文件**: 使用`java.io.File`类创建一个`File`对象,然后通过`FileInputStream`或`BufferedReader`...
`cpdetector`是字符集探测器,它包含多种字符集识别算法,如JChardet(基于Mozilla的开源项目),用于自动检测文件的编码方式。而`chardet.jar`可能就是JChardet的实现,它基于字节序列的概率模型来识别编码。 `...
首先,`chardet.jar` 是一个字符集检测库,它基于开源项目 `Chardet` 实现,能够自动识别不同类型的字符编码。Chardet 使用概率模型分析字节序列,根据出现的频率和特定编码规则来判断文件的可能编码。这种方法尤其...
我们可以构建一个相对完善的乱码处理流程:首先使用jchardet尝试自动检测文本的编码,如果失败则转而使用cpdetector进行更深入的分析,最后还可以利用antlr来解析可能存在的结构化信息,辅助编码识别。在实际的爬虫...
CPDetector库包含多种字符集检测算法,如JChardet(基于Mozilla的chardet),它通过分析文件的字节模式来猜测编码。 3. `chardet.jar`: 这可能是JChardet的独立版本或者与CPDetector一起使用的版本,JChardet是...
这时,我们需要通过一定的方法来识别或猜测文件的编码,如通过字节顺序标记(BOM)或者使用如JChardet这样的库进行自动检测。 字节顺序标记(BOM)是某些Unicode编码(如UTF-16、UTF-32)特有的标识,它位于数据的...
但对于非ASCII字符集,如GBK或UTF-8,文件的开头可能会包含特定的字节序列来标识编码。例如,UTF-8编码的文件,如果以BOM(Byte Order Mark)开始,那么前三个字节的值会是-17(0xEF)、-69(0xBB)和-65(0xBF)。...
- **编程实现**:例如在Android中,可以自定义函数读取文件部分内容,然后通过比较各种编码方式解码后的字符集是否符合预期来推断编码。 2. **文件转码** - **使用内置API**:在Java和Android中,`java.nio....
它分析文件中的字节序列,查找符合各种编码规则的字节模式,然后根据这些模式出现的概率来确定最可能的字符集。具体来说,它使用了一些开源的编码检测算法,如jChardet(基于Mozilla的chardet)和ICU4J的...
在IT行业中,处理文本数据时,正确的字符编码识别至关重要。`cpdetector`, `antlr`, 和 `chardet` 是三个与文档编码解析相关的Java库,它们在处理不同编码格式的文件时发挥着关键作用。接下来,我们将深入探讨这三个...
这个库包含了多个编码识别算法,例如NLS Charset Detector、JChardet(基于Mozilla的开源项目)等,能够处理多种常见和不常见的编码格式。 以下是如何使用`CPDetector`来自动检测和读取文件编码的步骤: 1. 引入`...
JavaScript中处理这些格式可能需要使用特定的库,例如`sms-parser`库,它可以帮助解析7位编码的短信并进行扩展字符集的处理。 总的来说,"sms-message-parsing"项目揭示了在JavaScript环境中处理编码多样性的挑战。...