将eclipse工作空间的编码字符集改为UTF-8

 
 
1.新建一个工作空间 并设置全局编码为UTF-8
2.用程序将旧的工作空间的编码改为UTF-8编码
package transcoder;

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.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.nio.charset.Charset;

/**
 * 注意:该代码慎用,html文件可能出问题 ,一般不会出问题
 * 依赖:第三方探测编码的jar包---cpdetector 网上有资源
 * 将eclipse工作空间的其他格式的编码项目(主要转Java文件,jsp文件,html文件,txt文件--------其余文件直接拷贝)转为utf-8编码
 * 
 * @author 111
 *
 */
public class GbkToUtf8 {
	/*
	 * 旧的文件夹   注意:一定不要写项目文件夹,否则web项目名会被替代成新的名字,那就要改web项目的配置文件的名字
	 * */
	private static final String OLD_DIRECTORY="workspace";
	private static final String NEW_DIRECTORY="hhh";//新的文件夹  名字随便
	public static void main(String[] args) {
		ergodic(new File("e:/workspace"));
		
	}
	/**
	 * 遍历文件夹
	 * @param f
	 */
	public static void ergodic(File f) {
		if(f.isFile()){
			if(f.getName().endsWith(".java")||f.getName().endsWith(".txt")||f.getName().endsWith(".jsp")||f.getName().endsWith(".html")){
				String charset = juageCoding(f);
				if(charset.equals("UTF-8")){
					copy(f);
				}else{
					copy(f,charset);
				}
			}else{
				copy(f);
			}
		}else{
			//创建文件夹
			File f1=new File(f.getAbsolutePath().replace(OLD_DIRECTORY, NEW_DIRECTORY));
			f1.mkdir();
			File[] listFiles = f.listFiles();
			for (File file : listFiles) {
				ergodic(file);
			}
		}
	}
	/**
	 * 判断文件编码字符集
	 * @param f
	 * @return
	 */
	public static String juageCoding(File f){
		CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();//探测器
		 detector.add(new ParsingDetector(false));//探测实现类
           detector.add(JChardetFacade.getInstance());//探测实现类
           detector.add(ASCIIDetector.getInstance());//探测实现类
           detector.add(UnicodeDetector.getInstance());//探测实现类
           Charset charset=null;//编码字符集
           try {
				charset = detector.detectCodepage(f.toURL());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
           System.out.println(f.getName()+"========"+charset.name());
           /**
            * GB2312探测的编码可能是"windows-1252",但是由于某些原因解码会导致乱码;
            * 所以一旦探测编码是"windows-1252",则返回编码名为"GB2312"
            * 否则返回编码字符集的名字
            */
           if(charset.name().equals("windows-1252")){
				return "GB2312";
			}else{
				return charset.name();
			}
           
	}
	/**
	 * 解码再复制文件
	 * @param f  复制的文件
	 * @param charset 编码字符集
	 */
	public static void copy(File f,String charset){
		try {
			FileInputStream in = new FileInputStream(f);
			//缓冲区
			byte[] b=new byte[1024];
			FileOutputStream out=new FileOutputStream(f.getAbsolutePath().replace(OLD_DIRECTORY, NEW_DIRECTORY));
			int len=-1;
			while((len=in.read(b))!=-1){
				//先按编码字符集解码再按"UTF-8"编码
				out.write(new String(b,0,len,charset).getBytes("utf-8"));
			}
			in.close();
			out.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 直接复制文件
	 * @param f  复制的文件
	 */
	public static void copy(File f){
		try {
			FileInputStream in = new FileInputStream(f);
			//缓冲区
			byte[] b=new byte[1024];
			FileOutputStream out=new FileOutputStream(f.getAbsolutePath().replace(OLD_DIRECTORY, NEW_DIRECTORY));
			int len=-1;
			while((len=in.read(b))!=-1){
				out.write(b, 0, len);
			}
			in.close();
			out.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

 
 

猜你喜欢

转载自blog.csdn.net/wufeiha/article/details/80295693