公司的java项目一开始为了和php的编码保存统一而采用了GBK,但是现在发现越来越多不方便的地方,于是决定全部转向UTF-8。为了能够把已写的源代码全转化到utf-8下,我写了一下小程序,用groovy写的。由于groovy学得还不够好,所以写出程序太java了。程序会把指定目录下的所有的文件都按照指定编码的方式读入,再以指定编码的方式写回到别外的目录里。代码如下:

import java.nio.charset.Charset;
public class Main{
	public static void main(String[] args) {
		if(args.length != 4) {
			println("Useage: convertEncoding fileName toDir fromEncoding" 
				+"toEncoding")
		}
 
		def file = new File(args[0])
		def toFile = new File(args[1])
		def fromEncoding = args[2]
		def toEncoding = args[3]
 
		convert(file, toFile, fromEncoding, toEncoding)
	}
 
	public static void convert(File fromFile, File toFile, 
			String fromEncoding, String toEncoding) {
		if(!fromFile.exists()) 
			return;
 
		if(!fromFile.isDirectory()) {
			BufferedReader reader = null;
			BufferedWriter writer = null;
			if(fromEncoding == null || !Charset.isSupported(fromEncoding)) {
				reader = new BufferedReader(new InputStreamReader
					(new FileInputStream(fromFile)))
			} else {
				reader = new BufferedReader(new InputStreamReader
					(new FileInputStream(fromFile), fromEncoding))
			}
			if(toEncoding == null || !Charset.isSupported(toEncoding)) {
				writer = new BufferedWriter(new OutputStreamWriter
					(new FileOutputStream(toFile)))
			} else {
				writer = new BufferedWriter(new OutputStreamWriter
				(new FileOutputStream(toFile), toEncoding))
			}
 
			String line = ""
			while(line != null) {
				line = reader.readLine()
				if(line == null) break;
				writer.write(line+"\r\n");
			}
			reader.close();
			writer.flush();
			writer.close();
		} else {
			File[] files = fromFile.listFiles();
 
			for(File file : files) {
				if(file.isDirectory()) {
					if(file.name == ".svn") {
						continue
					}
					File toSubDir = new File(toFile, file.getName())
					if(!toSubDir.mkdir()) {
						println("create subdir : ${toSubDir} fail")
					} else {
						println("create subdir : ${toSubDir}")
					}
					convert(file, toSubDir, fromEncoding, toEncoding);
				} else {
					if(
						!file.name.endsWith(".java") &&
						!file.name.endsWith(".xhtml") &&
						!file.name.endsWith(".xml") &&
						!file.name.endsWith(".txt")
					) {
						continue;
					}
					File toNewFile = new File(toFile, file.name)
					convert(file, toNewFile, fromEncoding, toEncoding)
					println("File : ${file.absolutePath} converted " 
					+ "to ${toNewFile.absolutePath} ");
				}
			}
		}
	}
}

Share/Save/Bookmark