[JAVA] 又是乱码
捕获自定义异常,并纪录到数据库时,发现java源文件中写的中文在数据库里显示为乱码,而在Windows下和输出的日志文件均显示正常,估计是Unix和Windows主机字符集不一致造成,试过将ISO-8859-1、UTF-8、US-ASCII转换为GBK,均无效。
后来想想,为什么源文件里写的中文会有问题呢?估计是不同环境编译时产生的(项目编译是通过ant在不同环境下编译打包)。反编译看了看,确实不一致,javac编译时,按照系统的默认编码格式进行编译,GB平台上用GBK,EN平台上用ISO-8859-1。
java 源文件:
Windows(GBK)下javac编译结果:
Unix(ISO-8859-1)下javac编译结果:
修改ant文件,加入指定编码参数(javac 也可以通过 -encoding <encoding> 指定),Unix下和Windows下编译结果也一致了,输入到数据库里编码正确。但是输出到日志文件则会出现乱码。肯定和Unix下文件格式不一致有关。
从系统环境中获取文件编码格式,再转换为GBK格式后,日志文件和数据库都正确了。
顺便输出系统环境中的文件编码,居然是ISO8859-1(晕),和ISO-8859-1有什么不一样?Google一下。
总结:
不同环境下编译,需要注意指定编译时的编码格式。
Unix下利用locale -a,注意主机编码格式。
后来想想,为什么源文件里写的中文会有问题呢?估计是不同环境编译时产生的(项目编译是通过ant在不同环境下编译打包)。反编译看了看,确实不一致,javac编译时,按照系统的默认编码格式进行编译,GB平台上用GBK,EN平台上用ISO-8859-1。
java 源文件:
throw new DownloadException("文件级错误生成error文件失败," +
e.getMessage());
Windows(GBK)下javac编译结果:
throw new DownloadException("\u6587\u4EF6\u7EA7\u9519\u8BEF\u751F\u6210error\u6587\u4EF6\u5931\u8D25\uFF0C"
+ exception.getMessage());
Unix(ISO-8859-1)下javac编译结果:
throw new DownloadException("\326\264\320\320excuteSql\267\275\267\250\263\366\264\355\243\254"
+ dbexception.getMessage());
修改ant文件,加入指定编码参数(javac 也可以通过 -encoding <encoding> 指定),Unix下和Windows下编译结果也一致了,输入到数据库里编码正确。但是输出到日志文件则会出现乱码。肯定和Unix下文件格式不一致有关。
<javac srcdir="${src.dir}" destdir="${classes.dir}" encoding="GBK">
<classpath refid="classpath" />
</javac>
<classpath refid="classpath" />
</javac>
从系统环境中获取文件编码格式,再转换为GBK格式后,日志文件和数据库都正确了。
errorinfo = new
String(errorinfo.getBytes(System
.getProperty("file.encoding")), "GBK");
.getProperty("file.encoding")), "GBK");
顺便输出系统环境中的文件编码,居然是ISO8859-1(晕),和ISO-8859-1有什么不一样?Google一下。
很多 locale 有许多别名,比如ISO-8859-1也被称为iso8859-1"和"iso88591。一些应用程序不能正确的处理这些别名,所以安全的做法是使用 locale
的规范名称。要确定正确的规范名称,运行下面的命令,并把其中的 [locale name] 替换成 locale
-a
命令的输出中你感兴趣的 locale (在这个例子中是"en_GB.iso88591")。
总结:
不同环境下编译,需要注意指定编译时的编码格式。
Unix下利用locale -a,注意主机编码格式。