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

我正在读这个

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

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

我可以使用一个Charset来阅读它,所以它每次都有效。 Charset.forName(“UTF-8”)可能吗?

谢谢,迪恩

字符编码各不相同

任何工具都可以用任何编码编写Java源代码。 即使是.java文件的想法也没有由Java语言规范定义。 任何IDE都可以以任何方式持久保存Java源代码以及任何编码。

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

Java语言规范在第3章词汇结构中说明

程序使用Unicode字符集编写。 有关此字符集及其相关字符编码的信息, 请访问http://www.unicode.org/ 。

因此,可能是Java源代码文件将使用Unicode中常见的字符编码之一,如UTF-8 , UTF-16或UCS-2。

3.2节词法翻译提到Java程序可以通过嵌入Unicode转义来使用ASCII等编码:

forms为\ uxxxx的Unicode转义,其中xxxx是hex值,表示编码为xxxx的UTF-16代码单元。

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

其他问题

顺便说一下,请注意,至少在Oracle JDK中,由于一个永远不会修复的错误( JDK-4508058 ),Java中不允许使用UTF-8文件可选的字节顺序标记(BOM) (因为后向 -兼容性问题)。

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

空白区域有所不同:SPACE(SP),CHARACTER TABULATION(HT)(水平标签),FORM FEED(FF)和行终止符。

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

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

关于字符编码

确保您了解Unicode和字符编码的基础知识。 最佳起点: 绝对最低限度每个软件开发人员绝对必须知道关于Unicode和字符集(没有借口!)作者:Joel Spolsky。


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