プログラム解決Antコンパイルutf-8不正文字:65279
一般に、UEまたはノートで編集されたUTF-8のファイルヘッダには、3つのcharからなるBOM識別子が付加される.UTF-8の規格ではこのBOM識別はあってもなくてもよいが、SunのjavacはBOM付きUTF-8の形式のファイルをコンパイルする際に「不正文字:65279」というエラーが発生するが、Eclipseでコンパイルするのは問題ない.なぜなら、Eclipseはjavacではなく独自のJDTを使用しているため、JDTに関する説明はeclipseの公式サイトで見ることができる.この場合,ネットワーク上では,a)UE,Editplusなどのテキストエディタを用いてBOMを持たないUTF-8形式bのファイルを再保存する)eclipseが持参したコンパイラを用いてコンパイルできる2つの解決策が提供される.antにpropertyを追加し、eclipse jdt compilerコンパイル-->関連jarパッケージを使用して、eclipseインストールファイルpluginsディレクトリの下:org.eclipse.jdt.core_xxx.JAr,xxxはバージョン番号ですが、第1の方法では、ファイルが多すぎると、第2の方法では実行できないのは明らかです.私は何度も試しても成功しませんでした.ここで私の方法を提供して、プログラムの方式を採用して、コンパイルする前にutf-8タグのファイルの前の3つのタグの文字を取り除きます.antコード:
提供される2つのパラメータは主にjavaファイルパスを指定するためです.
UTF8Parser.java
<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>
提供される2つのパラメータは主に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);
}
}
}
}
}