读取 java 源文件时使用什么字符集?

Dea*_*ler 3 java character-encoding

我在读这个

源代码是否应该以 UTF-8 格式保存

我正在使用 eclipse 编译器库,但需要读取一些 java 源文件以将其提供给该库。它似乎可以以与该帖子不同的格式存储。

是否有一个字符集可以用来读取它,以便每次都能使用。Charset.forName("UTF-8") 也许?

谢谢,院长

Bas*_*que 5

字符编码不同

任何工具都可以用任何编码编写 Java 源代码。甚至 .java 文件的想法也不是由Java Language Spec定义的。任何IDE都可以使用任何编码以任何方式保留 Java 源代码

这些工具负责最终将符合 Unicode 的字符流提供到编译器工具链中。他们如何收集和保存源代码取决于特定的工具。

Java 语言规范在第 3 章词法结构中指出:

程序是使用 Unicode 字符集编写的。有关此字符集及其相关字符编码的信息可以在http://www.unicode.org/上找到。

因此,据推测,Java 源代码文件将使用 Unicode 常见的字符编码之一,例如UTF-8UTF-16或 UCS-2。

第 3.2 节词法转换提到 Java 程序可以通过嵌入 Unicode 转义来使用诸如ASCII 之类的编码:

\uxxxx 形式的 Unicode 转义,其中 xxxx 是一个十六进制值,表示编码为 xxxx 的 UTF-16 代码单元。

虽然 UTF-8 在我的经验中很常见,但这并不是唯一可能的编码。您必须知道或猜测任何特定源文件的编码,并且必须考虑扩展任何 Unicode 转义符。

其他事宜

顺便说一句,注意,至少在Oracle JDK,在字节顺序标记(BOM) 可选为UTF-8的文件是不是由于错误在Java中允许(JDK-4508058),将永远是固定的(因为向后兼容性问题)。

另请注意,行终止符可能会有所不同:ASCII 字符 CR (CARRIAGE RETURN)、LF (LINE FEED) 或 CR LF。

空白区域各不相同:空格 (SP)、字符制表 (HT)(水平制表符)、换页符 (FF) 和行终止符。

阅读规范以获取更多详细信息。例如,关于 SUBSTITUTE 字符:

作为与某些操作系统兼容的特殊让步,如果 ASCII SUB 字符(\u001a 或 control-Z)是转义输入流中的最后一个字符,则它会被忽略。

关于字符编码

确保您了解 Unicode 和字符编码的基础知识。最佳起点:Joel Spolsky的绝对最低要求,每个软件开发人员绝对,肯定必须了解 Unicode 和字符集(没有借口!)


甚至诸如“每个 .java 文件一个公共类”之类的假设规则也可能由特定工具而不是 Java 本身定义。用于 Java 回退的CodeWarrior工具支持每个文件的多个类。

  • 写得不错,但您没有完全涵盖问题的要点,即“.java”源文件的编码。[`javac`](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html) 将默认为操作系统代码页:*如果未指定 `-encoding` 选项指定,然后使用**平台默认**转换器。* Eclipse(在注释中提到)可以处理每个“.java”源文件使用不同的代码页,但如果您想在 Eclipse 之外进行编译,您可以最好对所有源文件仅使用一个代码页。如果不是默认值,则必须明确给出。 (2认同)