1. 程式人生 > >將eclipse工作空間的編碼字符集改為UTF-8

將eclipse工作空間的編碼字符集改為UTF-8

1.新建一個工作空間 並設定全域性編碼為UTF-82.用程式將舊的工作空間的編碼改為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();
		}
	}
	
}