將eclipse工作空間的編碼字符集改為UTF-8
阿新 • • 發佈:2019-01-22
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(); } } }