Ant编译出现乱码问题解决

最近几天碰到一个Ant编译后,出现乱码的问题,纠结了几天,目前应该算是解决了。事情是这样,手头有一个java的工程,由于是在windows下开发的,所以源码的编码格式均为gbk,之前工程的编译都是在windows环境下进行,所以一直也没有问题。最近由于环境管控需要(《在Linux下的用户特殊操作权限控制》),尝试在Linux环境下进行自动编译和部署,因此就出现了编译出来的应用有乱码的问题,查了几个地方,已确定是ant的javac和copy指令的参数配置问题,在这里把过程中学习到的知识记录一下。

首先是Java的编译和运行机制,从.java编译为.class的过程中,javac会默认按照编译所在操作系统的默认编码读取源代码,并编译成内部为UTF-8编码的.class,而在java虚拟机执行的过程中,会按照程序运行所在操作系统的默认编码,将UTF-8编码再次进行转换。通过这种两次转换的方式,Java实现了对多语言的支持。

要改变javac读取源代码时采用的编码格式,如指定为GBK编码读取,需要在执行javac时添加-encoding=GBK参数进行指定;而要改变java运行时输出的编码格式,则需要添加-Dfile.encoding=GBK参数进行指定。而在ant的build.xml文件中,对应是在javac任务中,添加encoding属性,就解决了在默认为UTF-8编码的Linux环境下,读取编译GBK编码内容的问题,至此,已经解决了我工程中大部分的编译问题。

另一个问题出现在Ant的copy任务中,由于程序中的部分内容,是在ant执行过程中通过交互界面输入并设置filtering进行替换的,但Ant在Linux下执行时,也是按照操作系统默认编码UTF-8读取文件和进行替换,就导致了GBK的程序在替换后出现了乱码,无法编译通过。要解决这个问题,则是在Ant的copy任务中,添加encoding=”GBK”参数,指定读取文件的编码为GBK,也就解决了这个问题。关于copy的参数说明,可以参见官方手册