java自动根据文件内容的编码来读取避免乱码

通过cpdetector这个开源的jar包可以自动判断当前文件的内容编码,从而在读取的时候选择正确的编码读取,避免乱码问题。

 原创不易,转载请注明出处:java自动根据文件内容的编码来读取避免乱码

测试结果,提供截图:

GBK文件内容

UTF8文件内容

 

运行结果:

package com.zuidaima.test;

import info.monitorenter.cpdetector.io.ASCIIDetector;
import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;
import info.monitorenter.cpdetector.io.ParsingDetector;
import info.monitorenter.cpdetector.io.UnicodeDetector;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Main {

	public static String getContent(String path) throws Exception {
		File file = new File(path);
		CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
		detector.add(new ParsingDetector(false));
		detector.add(JChardetFacade.getInstance());
		detector.add(ASCIIDetector.getInstance());
		detector.add(UnicodeDetector.getInstance());
		java.nio.charset.Charset charset = null;
		try {
			charset = detector.detectCodepage(file.toURI().toURL());
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		String charsetName = null;
		if (charset != null) {
			charsetName = charset.name();
		} else {
			charsetName = "UTF-8";
		}
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				new FileInputStream(file), charsetName));
		String line = null;
		String lines = "";
		while ((line = reader.readLine()) != null) {
			lines += line + "\n";
		}
		reader.close();
		return lines;
	}

	public static void main(String[] args) throws Exception {
		System.out.println(getContent("bin/gbk.txt"));
		System.out.println(getContent("bin/utf8.txt"));
	}
}

	    			

代码下载地址: http://www.zuidaima.com/share/1550463235574784.htm

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
detector是探测器,它把探测任务交给具体的探测实现类的实例完成。 cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。 detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的 字符集编码cpdetector.io.CodepageDetectorProxy detector = cpdetector.io.CodepageDetectorProxy.getInstance(); /*------------------------------------------------------------------------- ParsingDetector可用于检查HTML、XML等文件或字符编码,构造方法中的参数用于 指示是否显示探测过程的详细信息,为false不显示。 ---------------------------------------------------------------------------*/ detector.add(new cpdetector.io.ParsingDetector(false)); /*-------------------------------------------------------------------------- JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件编码 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。 ---------------------------------------------------------------------------*/ detector.add(cpdetector.io.JChardetFacade.getInstance()); //ASCIIDetector用于ASCII编码测定 detector.add(cpdetector.io.ASCIIDetector.getInstance()); //UnicodeDetector用于Unicode家族编码的测定 detector.add(cpdetector.io.UnicodeDetector.getInstance()); JAVA.nio.charset.Charset charset = null; File f=new File("待测的文本文件名"); try { charset = detector.detectCodepage(f.toURL()); } catch (Exception ex) {ex.printStackTrace();} if(charset!=null){ System.out.println(f.getName()+"编码是:"+charset.name()); }else System.out.println(f.getName()+"未知"); 上面代码中的detector不仅可以用于探测文件编码,也可以探测任意输入的文本编码,方法是调用其重载形式: Java代码 charset=detector.detectCodepage(待测的文本输入,测量该所需的读入字节数);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值