我知道用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上输出此文本,我可以得到不同的结果吗?服务器上的编码配置是否会以某种方式影响此文本的呈现?
正如OP在他的帖子中所说,源代码编码在编译时非常相关。然而,编译后,所有文字文本都存储为(修改后的)UTF-8 编码字符串。
所有字符串文字、类/方法/字段名称以及对它们的引用都以UTF-8编码存储在文件的常量.class池中:
4.4.7. CONSTANT_Utf8_info 结构
CONSTANT_Utf8_info 结构用于表示常量字符串值:
[...]
字符串内容以修改后的 UTF-8 进行编码。修改后的 UTF-8 字符串经过编码,以便每个代码点仅使用 1 个字节来表示仅包含非空 ASCII 字符的代码点序列,但可以表示 Unicode 代码空间中的所有代码点。
因此,一旦编译了源代码,它就会以已知的字符编码 (UTF-8) 存储,并且您不再需要指定源文件编码。
一般来说,JVM 规范的第 4.4节解释了常量池如何工作以及字符串、类/字段/方法名称等由结构表示CONSTANT_Utf8_info。