[JAVA] 又是乱码

捕获自定义异常,并纪录到数据库时,发现java源文件中写的中文在数据库里显示为乱码,而在Windows下和输出的日志文件均显示正常,估计是Unix和Windows主机字符集不一致造成,试过将ISO-8859-1、UTF-8、US-ASCII转换为GBK,均无效。

后来想想,为什么源文件里写的中文会有问题呢?估计是不同环境编译时产生的(项目编译是通过ant在不同环境下编译打包)。反编译看了看,确实不一致,javac编译时,按照系统的默认编码格式进行编译,GB平台上用GBK,EN平台上用ISO-8859-1。

java 源文件:

[JAVA] <wbr>又是乱码 throw new DownloadException("文件级错误生成error文件失败," + e.getMessage());[JAVA] <wbr>又是乱码

Windows(GBK)下javac编译结果:

[JAVA] <wbr>又是乱码 throw new DownloadException("\u6587\u4EF6\u7EA7\u9519\u8BEF\u751F\u6210error\u6587\u4EF6\u5931\u8D25\uFF0C" + exception.getMessage());

Unix(ISO-8859-1)下javac编译结果:

[JAVA] <wbr>又是乱码 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下文件格式不一致有关。


[JAVA] <wbr>又是乱码 <javac srcdir="${src.dir}" destdir="${classes.dir}" encoding="GBK">
[JAVA] <wbr>又是乱码
<classpath refid="classpath" />
[JAVA] <wbr>又是乱码
</javac>

从系统环境中获取文件编码格式,再转换为GBK格式后,日志文件和数据库都正确了。

[JAVA] <wbr>又是乱码 errorinfo = new String(errorinfo.getBytes(System
[JAVA] <wbr>又是乱码 .getProperty(
"file.encoding")), "GBK");


顺便输出系统环境中的文件编码,居然是ISO8859-1(晕),和ISO-8859-1有什么不一样?Google一下。


[JAVA] <wbr>又是乱码 很多 locale 有许多别名,比如ISO-8859-1也被称为iso8859-1""iso88591。一些应用程序不能正确的处理这些别名,所以安全的做法是使用 locale 的规范名称。要确定正确的规范名称,运行下面的命令,并把其中的 [locale name] 替换成 locale -a 命令的输出中你感兴趣的 locale (在这个例子中是"en_GB.iso88591")。

总结:
不同环境下编译,需要注意指定编译时的编码格式。
Unix下利用locale -a,注意主机编码格式。
posted @ 2007-05-18 09:19  vanuan  阅读(136)  评论(0编辑  收藏  举报