批处理文件的编码
耿祥义
2021-03-04
一.问题的提出
有人提出能否实现java源代码编码转换的批处理,即一次性地将若干个编码为ANSI的java源文件分别转成编码为utf-8的java源文件(用记事本打开源文件,选择另存,并将编码选择为utf-8,一个一个打开,再另存,有点麻烦)。我始终建议,除非源代码中用到GBK不支持的字符,否则选择ANSI编码保存。
如果保存java源文件时选择的编码是UTF-8,那么使用javac编译源文件时必须显式用-encoding参数,告知编译器使用怎样的编码解析、编译源文件,即-encodeing给出的值必须和源文件的编码相同(不显式使用-encodeing参数,那么默认该参数的值是GBK):
C:\chapter1> javac -encoding utf-8 Hello.java
ANSI编码在不同的系统中代表着不同的编码。在Windows简体中文系统下,ANSI 编码代表 GBK 编码,在Windows日文系统下,ANSI 编码代表 JIS 编码。GBK编码共收录了21003个汉字,完全兼容GB2312,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中、日、韩汉字(比如,日文的片假名等),并包含了BIG5编码中的所有汉字。如果Java源文件中使用的字符没有超出GBK支持的范围,保存源文件时就将编码选择为ANSI编码(保存到磁盘空间时,源文件中的汉字占用2个字节,ASCII字符占用1个字节)。
UTF-8编码支持Unicode字符集(见第2章),如果保存源文件时选择UTF-8编码,那么存储源文件时会多占用一些磁盘空间(一个汉字需占用3个字节),UTF-8兼容GBK、BIG5、EUC-JP等多种国家的语言的编码。除非源文件中确实需要GBK以外的字符,教材中保存源文件时选择的编码均为ANSI编码。
二、问题的解决
只要将ANSI编码的Java源文件,全部读入到一个byte数组a中,并使用当前默认的编码(GBK),将a中的字符封装到String对象s中,然后再将s中的字符序列重新按用户需要的编码,比如uff-8,重新编码即可。
String s = new String (a);
byte utf8[] = s.getBytes("utf-8");
最后将数组utf8写入到文件即可,那么该文件的编码就是utf-8编码(细节见后面的ChangeToUTF8类的代码)。
三、程序源代码和运行效果
1.主类
import java.io.File;
import java.util.Scanner;
public class MainClass {
public static void main(String args[]) {
ChangeToUTF8 change = new ChangeToUTF8(); //负责把ANSI编码文件转化成UTF-8编码文件
"分别转换为编码是utf-8的Java源文件");
Scanner reader=new Scanner(System.in);
String fileDir = reader.nextLine();
File javaDir = new File(fileDir);
if(javaDir.isDirectory()==false){
System.exit(0) ;
}
FileAccept fileAccept = new FileAccept();
fileAccept.setExtendName("java");
File file[] =javaDir.listFiles(fileAccept);//返回java源文件
if(file == null){
System.exit(0) ;
}
File javaUTFDir = new File(fileDir+"\\utf-8");
javaUTFDir.mkdirs();
change.changFlieToUTF8(javaUTFDir,file) ;//把ANSI编码文件转化成UTF-8编码文件
}
}
2.选择指定的扩展名的文件(主教材例子10.2)
import java.io.FilenameFilter;
import java.io.File;
public class FileAccept implements FilenameFilter {
private String extendName;
public void setExtendName(String s) {
extendName="."+s;
}
public boolean accept(File dir,String name) { //重写接口中的方法
return name.endsWith(extendName);
}
}
3.负责转换的类
import java.io.*;
public class ChangeToUTF8 {
//把数组file中的java源文件转换为编码是utf-8的Java源文件并保存在dir目录中
public void changFlieToUTF8(File dir,File[] file) {
for(int i=0;i
long length = file[i].length();
int n=-1;
byte [] a = new byte[(int)length];
try{
InputStream in = new FileInputStream(file[i]);
in.read(a);
String s = new String (a);
byte utf8[] = s.getBytes("utf-8");
in.close();
File utf8Java = new File(dir+"/"+file[i].getName());
FileOutputStream out = new FileOutputStream(utf8Java);
out.write(utf8);
}
catch(Exception e) {
}
}
}
}
领取专属 10元无门槛券
私享最新 技术干货