package arkref.ext.fig.basic; //import fig.exec.*; import static arkref.ext.fig.basic.LogInfo.*; import java.io.*; import java.nio.charset.*; public class ConvertEncoding { @Option(gloss="Input file", condReq="listEncodings=false") public static String inFile; @Option(gloss="Output file", condReq="listEncodings=false") public static String outFile; @Option(gloss="Input character encoding", condReq="listEncodings=false") public static String inEncoding; @Option(gloss="Output character encoding") public static String outEncoding = "UTF-8"; @Option(gloss="List possible encodings") public static boolean listEncodings = false; @Option(gloss="Convert to lowercase") public static boolean lowercase = false; @Option(gloss="Convert to uppercase") public static boolean uppercase = false; public static void printCharsets() { for(Charset charset : Charset.availableCharsets().values()) logs(charset); } public static String aliasEncoding(String encoding) { encoding = encoding.toUpperCase(); if(encoding.equals("GB")) return "GB2312"; return encoding; } // Adapted from IOUtils to handle lowercasing and uppercasing // Return number of characters copied public static int copy(Reader in, Writer out) throws IOException { char[] buf = new char[16384]; int total = 0, n; while((n = in.read(buf)) != -1) { if(uppercase) for(int i = 0; i < n; i++) buf[i] = Character.toUpperCase(buf[i]); if(lowercase) for(int i = 0; i < n; i++) buf[i] = Character.toLowerCase(buf[i]); total += n; out.write(buf, 0, n); } out.flush(); return total; } public static void convertFile() throws IOException { inEncoding = aliasEncoding(inEncoding); outEncoding = aliasEncoding(outEncoding); logs("Copying %s (%s) => %s (%s)...", inFile, inEncoding, outFile, outEncoding); InputStreamReader in = new InputStreamReader(new FileInputStream(inFile), inEncoding); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outFile), outEncoding); int n = copy(in, out); if(n == -1) throw new RuntimeException("Failed to copy"); logs("Wrote %d characters", n); in.close(); out.close(); } // public static void main(String[] args) { // Execution.init(args, "main", ConvertEncoding.class); // try { // if(listEncodings) printCharsets(); // else convertFile(); // } catch(Throwable t) { // Execution.raiseException(t); // } // Execution.finish(); // } }