jChardet探测文件字符编码

package test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
// jChardet 火狐所用字符编码检测算法
public class FileCharsetDetector {
    private boolean found = false;
    private String encoding = null;

    public static void main(String[] argv) throws Exception {
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\VideoViewDemo\\VideoViewDemo\\src\\org\\apache\\android\\media\\AudioPlayer.java");
        
        System.out.println("文件编码:" + new FileCharsetDetector().guessFileEncoding(file1));
    }

    /**
     * 传入一个文件(File)对象,检查文件编码
     * 
     * @param file
     *            File对象实例
     * @return 文件编码,若无,则返回null
     * @throws FileNotFoundException
     * @throws IOException
     */
    public String guessFileEncoding(File file) throws FileNotFoundException, IOException {
        return guessFileEncoding(file, new nsDetector());
    }

    /**
     * <pre>
     * 获取文件的编码
     * @param file
     *            File对象实例
     * @param languageHint
     *            语言提示区域代码 @see #nsPSMDetector ,取值如下:
     *             1 : Japanese
     *             2 : Chinese
     *             3 : Simplified Chinese
     *             4 : Traditional Chinese
     *             5 : Korean
     *             6 : Dont know(default)
     * </pre>
     * 
     * @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null
     * @throws FileNotFoundException
     * @throws IOException
     */
    public String guessFileEncoding(File file, int languageHint) throws FileNotFoundException, IOException {
        return guessFileEncoding(file, new nsDetector(languageHint));
    }

    /**
     * 获取文件的编码
     * 
     * @param file
     * @param det
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    private String guessFileEncoding(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) {
                encoding = charset;
                found = true;
            }
        });

        BufferedInputStream imp = new BufferedInputStream(new FileInputStream(file));
        byte[] buf = new byte[1024];
        int len;
        boolean done = false;
        boolean isAscii = false;

        while ((len = imp.read(buf, 0, buf.length)) != -1) {
            // Check if the stream is only ascii.
            isAscii = det.isAscii(buf, len);
            if (isAscii) {
                break;
            }
            // DoIt if non-ascii and not done yet.
            done = det.DoIt(buf, len, false);
            if (done) {
                break;
            }
        }
        imp.close();
        det.DataEnd();

        if (isAscii) {
            encoding = "ASCII";
            found = true;
        }

        if (!found) {
            String[] prob = det.getProbableCharsets();
            //这里将可能的字符集组合起来返回
            for (int i = 0; i < prob.length; i++) {
                if (i == 0) {
                    encoding = prob[i];
                } else {
                    encoding += "," + prob[i];
                }
            }

            if (prob.length > 0) {
                // 在没有发现情况下,也可以只取第一个可能的编码,这里返回的是一个可能的序列
                return encoding;
            } else {
                return null;
            }
        }
        return encoding;
    }
}

参考文章:

http://www.cnblogs.com/yejg1212/p/3402322.html

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1774032

时间: 2024-10-29 00:35:14

jChardet探测文件字符编码的相关文章

CentOS设置文件字符编码的方法

  1.查看文件字符编码 ###using file command### [root@ipython report]# file --mime-encoding analysis.csv analysis.csv: utf-8 ###using vim command### [root@ipython report]# vim analysis.csv :set fileencoding fileencoding=utf-8 2.设置文件字符编码 ####using iconv command

怎么识别zip文件字符编码方式?UTF-8,GBK等等

问题描述 google了好久没有找到,求思路 解决方案 本帖最后由 hero06 于 2014-08-19 15:13:10 编辑解决方案二:编码应该是里面文件的编码吧,单纯zip是没有编码的.解决方案三:引用1楼fangmingshijie的回复: 编码应该是里面文件的编码吧,单纯zip是没有编码的. 在不知道文件编码的情况下zip文件怎么解压缩不报错解决方案四:解压缩报错,是里的文件或者代码有问题,和zip文件本身什么编码没有关联.解决方案五:引用3楼fangmingshijie的回复: 解

JAVA探测文件编码

我们在做一些类似文件上传的功能时,用户上传的文件编码,我们是无法控制的,这是我们就需要对文件的编码进行探测. 示例代码如下: import info.monitorenter.cpdetector.io.ASCIIDetector; import info.monitorenter.cpdetector.io.CodepageDetectorProxy; import info.monitorenter.cpdetector.io.JChardetFacade; import info.moni

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

.NET自动字符编码识别程序库 NChardet

编码|程序 什么是NChardet      NChardet是mozilla自动字符编码识别程序库chardet的.NET实现,它移植自jchardet,chardet的java版实现,可实现对给定字符流的编码探测.  NChardet是如何工作的      NChardet通过逐个比较输入字符来猜测编码:由于是猜测,所以可能会有不能完全识别的情况:如果输入字符不能确定正确的编码,那么NChardet会给出一组可能的编码值.  如何使用NChardet     要使用NChardet来探测编码

关于字符编码,你所需要知道的

字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASCII码说起   说到字符编码,不得不说ASCII码的简史.计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处理.但由于计算机只识"数",因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母'A',66代表字母'B',以此类推.但是计算机之间字符-数字的对应关系必须得一致,否

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.4 字符编码方式

2.2.4 字符编码方式 输入和输出流都是用于字节序列的,但是在许多情况下,我们希望操作的是文本,即字符序列.于是,字符如何编码成字节就成了问题. Java针对字符使用的是Unicode标准.每个字符或"编码点"都具有一个21位的整数.有多种不同的字符编码方式,也就是说,将这些21位数字包装成字节的方法有多种. 最常见的编码方式是UTF-8,它会将每个Unicode编码点编码为1到4个字节的序列(请参阅表2-1).UTF-8的好处是传统的包含了英语中用到的所有字符的ASCII字符集中的

文件名的字符编码和c的fopen函数问题

问题描述 文件名的字符编码和c的fopen函数问题 问一个问题,文件名的存储和文件名的显示应该是两回事吧 中文版windows的环境字符集是GBK GBK中"茅"的编码是 195 169(十进制) 如果我在中文版windows里看到个文件叫"a茅" 那么他的文件名在硬盘中的存储方式应该是97 195 169 我编了个c程序如下: FILE *fp; char b[100]={'a',195,169,0}; strcat(b,".html"); i

tomcat下的jsp和servlet的字符编码问题

js|servlet|编码|问题 使用filter来改变request的编码 在前面的文章里面,我们讨论了在tomcat下的jsp和servlet的字符编码问题! 知道当没有指定request的编码的时候,从客户端得到的数据是iso-8859-1编码的(request.getParameter()得到传递的参数值): 但是我们怎么来改变request的编码呢? 方法有很多种!  比如:在getRequestDispatcher("/jsp/jsptoserv/hello.jsp").f