关于native2ascii的某某

在此处输入标题今天深圳一扫周末的阴冷,阳光明媚。但是一上班,就有一个乱码的问题,上周一个同事修改了代码,使用新的流水线部署后,发出的邮件标题是乱码!而这个同事并没有更改邮件的相关代码。邮件功能以前也是正常的,并没有出现过乱码的现象。

这个发送邮件的过程如下:

  1. Java代码从mail.properties文件读取标题和正文,标题和正文使用类似{0}的占位符进行内容的动态输出;
  2. 然后Java代码从数据库获取收件人,抄送人列表,构建邮件,最后发送。

这次奇怪的是,邮件正文是正常的,标题是乱码的。我看了正文用的是HTML格式,指定了编码charset='gb2312'。

现在就确定是mail.properties文件出问题了。

原本的mail.properties文件是gbk的(为什么不是UTF-8?这个又是另外一个忧伤的故事了)。在build.xml中,会使用命令native2ascii命令将该文件转码,形如:

<native2ascii 
     src="srcdir"
     dest="srcdir"
     includes="**/*.properties" 
/>

native2ascii的介绍见官方文档,将文件从本地编码转成ASCII编码。

问题就是这个本地编码,不同的操作系统甚至同一操作系统的不同JDK版本,或者同一JDK版本不同的启动命令,都会导致结果不一致。
查询方法如下:

System.getProperties("file.encoding");

在我本机windows7,Weblogic带的jdk的结果是GB18030,而我自用的JDK7结果是UTF-8,我在流水线部署机上执行了一下,也是UTF-8。

而我问了平台开发组的同事,原来的自动移交部署在Windows上编译生成的,默认编码是GBK的,而mail.properties文件也是GBK,正好,没有问题。使用了新的流水线部署后,Linux的默认编码为UTF-8,这下就出问题了。

而解决方法就是native2ascii的时候指定编码格式:

<native2ascii
     encoding="GBK"
     src="srcdir"
     dest="srcdir"
     includes="**/*.properties"
>

这样就可以了。

同样的还有javac的命令,也要指定编码,如下:

<javac srcdir="${src}"
    destdir="${build}"
    classpath="xyz.jar"
    encoding="GBK"   
>

我认为,这种和编码有关的命令或处理,不能依赖于外部变量,比如操作系统,比如JDK版本,都要显示的指出输入编码和输出编码。

标签: Java, native2ascii, ant

添加新评论