gpt4 book ai didi

Java编译平台文件编码问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:23 27 4
gpt4 key购买 nike

最近我遇到了一个我不记得曾经遇到过的文件字符编码问题。在不同平台上运行时,必须了解文本文件的字符编码并编写正确处理编码的代码是很常见的。但是我发现的问题是在与执行平台不同的平台上编译造成的。这是完全出乎意料的,因为根据我的经验,当 javac 创建类文件时,重要的参数是 java 源和目标参数,以及进行编译的 JDK 版本。我的情况是,当在 Mac OS X 上运行时,在 Mac OS X 上使用 JDK 1.6.0_22 编译的类与在 Linux 上使用 1.6.0_23-b05 编译的类的行为不同。指定的源和目标是 1.4。

使用 PrintStream println 方法将内存中编码为 ISO-8859_1 的字符串写入磁盘。根据 Java 代码在哪个平台上编译,字符串的编写方式也不同。这导致了一个错误。该错误的修复是在写入和读取文件时明确指定文件编码。

令我吃惊的是,行为的不同取决于类的编译位置,而不是类在哪个平台上运行。我非常熟悉在不同平台上运行时表现不同的 Java 代码。但是当在不同平台上编译的相同代码在同一平台上运行不同时,这有点可怕。

有人遇到过这个问题吗?对于任何在没有明确指定字符编码的情况下将字符串读取和写入文件的 Java 代码来说,这似乎都是不祥之兆。多久做一次?

最佳答案

没有像内存中编码为 ISO-8859-1 的字符串 这样的东西。内存中的 Java 字符串始终是 Unicode 字符串。 (以 UTF-16 编码(截至 2011 年——我认为它随着后来的 Java 版本而改变),但你现在真的不需要这样做)。

编码仅在您输入或输出字符串时起作用 - 然后,在没有明确编码的情况下,它使用系统默认值(在某些系统上取决于用户设置)。

正如 McDowell 所说,源文件的实际编码应该与编译器假定的源文件编码相匹配,否则您会遇到观察到的问题。您可以通过多种方式实现这一目标:

  • 使用编译器的-encoding 选项,给出源文件的编码。 (对于 ant,您设置 encoding= 参数。)
  • 使用您的编辑器或任何其他工具(如 recode)将文件编码更改为编译器默认值。
  • 使用 native2ascii(使用正确的 -encoding 选项)通过 \uXXXX-escapes 将您的源文件转换为 ASCII。

在最后一种情况下,您稍后可以使用每种默认编码在任何地方编译此文件,因此如果您将源代码提供给编码不了解的人在某处编译,这可能是可行的方法。

如果您有一个包含多个文件的更大项目,它们应该都具有相同的编码,因为编译器只有一个这样的开关,而不是多个。

在我过去几年的所有项目中,我总是将所有文件编码为 UTF-8,并在我的 ant 构建文件中将 encoding="utf-8" 参数设置为 javac 任务. (我的编辑器足够聪明,可以自动识别编码,但我将默认设置为 UTF-8。)

编码对其他源代码处理工具很重要,例如 javadoc。 (你还应该为输出添加 -charset-docencoding 选项 - 它们应该匹配,但可以与 source--encoding.)

关于Java编译平台文件编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com