`
hy3112
  • 浏览: 5070 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

程序解决Ant编译utf-8非法字符:\65279

阅读更多

一般用UE或记事本编辑过的UTF-8的文件头会加入BOM标识,该标识由3个char组成。在UTF-8的标准里该BOM标识是可有可无的,Sun 的javac 在编译带有BOM的UTF-8的格式的文件时会出现“非法字符:\65279”的错误,但是用Eclipse进行编译却没有问题,原因在于Eclipse使用的是自己的JDT,而非javac,关于JDT的描述可以到eclipse的官网上去查看。

出现这种情况时,网上提供了两种解决方法:
a) 利用UE、Editplus等文本编辑器重新保存文件为不带BOM的UTF-8格式
b) 可使用eclipse自带的编译器进行编译
<!--在ant中添加property,使用eclipse jdt compiler编译-->
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />
相关jar包,在eclipse安装文件plugins目录下:org.eclipse.jdt.core_xxx.jar,xxx为版本号

但对于第一种方法,如果文件过多,很显然不可行
对于第二种,我试了好几次也没有成功。

这里提供我的方式,采用程序的方式,编译前将带有utf-8标记的文件的前三个标记字符去掉。

ant代码:

 <target name="build.all" depends="svnGet,utf8">
  <echo>
   先清空目标路径 [${application}] 下的旧文件
  </echo>
  <delete dir="${application}" includeemptydirs="true" />
  <mkdir dir="${javac.dir}" />
  <echo>
   现在开始编译......,
   源文件路径是:${temp.dir}
   编译后的类路径是:${application}
  </echo>
  <javac target="1.5" encoding="utf-8" srcdir="${src.dir}" destdir="${javac.dir}" debug="on" memoryMaximumSize="256m">
   <classpath>
    <fileset dir="${javac.lib}" />
   </classpath>
  </javac>
  <echo>
   编译完毕!
  </echo>
 </target>
<!-- 清除utf-8标记 -->
 <target name="utf8">
  <echo>清除utf-8标记</echo>
  <java dir="./bin" classname="UTF8Parser" fork="true" failonerror="true" maxmemory="128m">
   <arg line="${basedir} ${src.dir}" />
  </java>
 </target>

 提供的两个参数主要是为了指定java文件路径

 

UTF8Parser.java

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class UTF8Parser {

    public static void main(String[] args) {
        if (args.length < 2) {
            return;
        }
        if (args[1].startsWith(".")) {
            args[1] = args[1].substring(1);
        }
        File file = new File(args[0] + args[1]);
        System.out.println("java代码位置:" + file.getAbsolutePath());
        UTF8Parser.clearUTF8Mark(file);
    }

    private static void clearUTF8Mark(File file) {
        if (file.isDirectory()) {
            for (File f : file.listFiles()) {
                clearUTF8Mark(f);
            }
        } else {
            FileInputStream fis = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
            OutputStream out = null;
            try {
                fis = new FileInputStream(file);
                is = new BufferedInputStream(fis);
                baos = new ByteArrayOutputStream();
                byte b[] = new byte[3];

                is.read(b);
                // System.out.println(b[0] + ":" + b[1] + ":" + b[2]);

                if (-17 == b[0] && -69 == b[1] && -65 == b[2]) {
                    System.out.println(file.getAbsolutePath());
                    b = new byte[1024];
                    while (true) {
                        int bytes = 0;
                        try {
                            bytes = is.read(b);
                        } catch (IOException e) {
                        }
                        if (bytes == -1) {
                            break;
                        }
                        baos.write(b, 0, bytes);

                        b = baos.toByteArray();
                    }
                    // System.out.println(new String(b, "utf-8"));
                    file.delete();

                    out = new FileOutputStream(file);
                    baos.writeTo(out);
                }
            } catch (Exception e) {
                System.exit(0);
            } finally {
                try {
                    if (fis != null) {
                        fis.close();
                    }
                    if (out != null) {
                        out.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                    if (baos != null) {
                        baos.close();
                    }
                } catch (Exception e) {
                    System.exit(0);
                }
            }
        }
    }
}

 

 

分享到:
评论
1 楼 robin_hu 2012-06-11  
我用记事本重新把原文件复制再保存,然后再覆盖工程目录的文件解决了

相关推荐

Global site tag (gtag.js) - Google Analytics