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(); } } }