Java源文件 - 编译后编码是否仍然相关?

ele*_*ype 5 java javac

我知道用Java加载文件而不指定要使用的编码是依赖平台的.但我的问题是关于包含在.java源文本文件本身:是否使用这些文件的编码仍然具有现实意义编译一次

例如,如果我test.java在Windows上有一个Cp1252编码的文件并包含:

private String encodingTest = "Bœuf fûmé";
Run Code Online (Sandbox Code Playgroud)

如果我使用它编译它-encoding Cp1252,结果中的文本究竟发生了什么.class?编码仍然重要吗?或者编译时Java编码的编码是什么?

结果.class会取决于平台吗?如果我在Windows,Linux,Solaris上输出此文本,我可以得到不同的结果吗?服务器上的编码配置是否会以某种方式影响此文本的呈现?

Erw*_*idt 2

正如OP在他的帖子中所说,源代码编码在编译非常相关。然而,编译后,所有文字文本都存储为(修改后的)UTF-8 编码字符串。

所有字符串文字、类/方法/字段名称以及对它们的引用都以UTF-8编码存储在文件的常量.class池中:

来自 JVM 规范(适用于 Java 版本 1.7)

4.4.7. CONSTANT_Utf8_info 结构

CONSTANT_Utf8_info 结构用于表示常量字符串值:

[...]

字符串内容以修改后的 UTF-8 进行编码。修改后的 UTF-8 字符串经过编码,以便每个代码点仅使用 1 个字节来表示仅包含非空 ASCII 字符的代码点序列,但可以表示 Unicode 代码空间中的所有代码点。

因此,一旦编译了源代码,它就会以已知的字符编码 (UTF-8) 存储,并且您不再需要指定源文件编码。

一般来说,JVM 规范的第 4.4节解释了常量池如何工作以及字符串、类/字段/方法名称等由结构表示CONSTANT_Utf8_info