【发布时间】:2011-02-07 22:48:27
【问题描述】:
最近我遇到了一个我不记得曾经遇到过的文件字符编码问题。必须了解文本文件的字符编码并编写在不同平台上运行时正确处理编码的代码是很常见的。但我发现的问题是由与执行平台不同的平台上的编译引起的。这完全出乎我的意料,因为根据我的经验,当 javac 创建类文件时,重要的参数是 java 源和目标参数,以及进行编译的 JDK 版本。我的情况是,在 Mac OS X 上使用 JDK 1.6.0_22 编译的类与在 Linux 上使用 1.6.0_23-b05 编译的类在 Mac OS X 上运行时的行为不同。指定的源和目标是 1.4。
使用 PrintStream println 方法将内存中编码为 ISO-8859_1 的字符串写入磁盘。根据 Java 代码在哪个平台上编译,字符串的编写方式不同。这会导致一个错误。该错误的修复是在写入和读取文件时明确指定文件编码。
令我惊讶的是,行为会因类的编译位置而异,而不是类在哪个平台上运行。我非常熟悉在不同平台上运行时表现不同的 Java 代码。但是,当在不同平台上编译的相同代码在同一平台上运行不同时,这有点可怕。
有人遇到过这个具体问题吗?对于任何在没有明确指定字符编码的情况下读取和写入字符串到文件的 Java 代码来说,这似乎都是不祥之兆。多久进行一次?
【问题讨论】:
-
问题文件是否编码为 utf-8?源中是否存在有问题的字符,或者这些字符是否仅在该特定机器上编译之后才无效?
-
这是否使用静态 final 编译到类中(编译静态 final 将字符串“烘焙”到类中)?或者当您说写入磁盘时,您是在序列化数据吗?序列化一个类实例?使用默认(即编译平台)编码编译的序列化方法?
-
@Steve B.:事实上,所有的字符串字面量和其他编译时常量字符串都被“烘焙”到了类中,而不仅仅是静态的 final 。
标签: java character-encoding javac