首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

批处理文件的编码

批处理文件的编码

耿祥义

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) {

         }

      }

  }

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210304A0D9D900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券