在某些历史遗留项目中,由于开发人员的不规范操作,比如使用不同平台的文本编辑器以及各种无视编码的复制粘贴,导致整个项目里面编码鱼龙混杂,有些编码文件或许经过几手的复制之后,以及完全丢失了起追踪编码的可能。在一般的情况下,都是通过外部的文本编辑工具进行强制编码转化并保存成新的文件的方式来保证编码一致的。但是如果遗留系统中包含大量的文件,而且具有不可预见量上的编码错误文件。你在使用javac的方式进行项目编译的时候,就会出现困难的情况。而在eclipse的项目中,由于使用了JIT的编译工具,避免了编码和BOM头的问题,所以在字节上如果不出现问题,都能编译出来。可是在外面工具,ant,maven等一些常用编译工具就会有问题。其中一种解决方案就是使用eclise的JIT进行编译,这需要对ant和maven的插件进行包装。不过这种方法,可能有不可见的问题,毕竟不是标准的官方编译程序。
另外一个方法就是对需要编译的文件进行编码检测和强转,这也是这个项目的初衷。对应的思路为:
1. 清除文件中BOM头
2. 通过使用第三方的编码校验工具库,对文件编码进行猜测
3. 只对两类文件进行编码转化:本地编码格式和目标编码格式(实际所需的编码格式)不一致,而文件可能为本地编码格式的;其他编码格式,不包含目标编码格式的文件
4. 转化的方法为:从猜测编码转化到目标编码
可能会产生三种情况: 猜测是正确的原文件编码,导致编码转化成功;猜测的编码文件里面包含了混合编码的情况,部分编码转化成功;猜测的编码是错误的,导致统一转化成目标的编码,这种会产生乱码,不过由于采用了目标编码格式,不影响编译器使用,但是可能导致部分在代码中的乱码会和原来代码不一致。
工程见: fileEncodingChange