我知道用Java加载文件而不指定要使用的编码是平台相关的。但我的问题是关于 .java源文件本身包含的文本:用于这些文件的编码是否仍然与编译后相关?
例如,如果我在Windows上有一个test.java
文件Cp1252
已编码且包含:
private String encodingTest = "Bœuf fûmé";
如果我使用-encoding Cp1252
进行编译,那么结果.class
中的文字会发生什么?编码仍然重要吗?或者编译时Java编码的编码是什么?
结果.class
是否依赖于平台?如果我在Windows,Linux,Solaris上输出此文本,我可以得到不同的结果吗?服务器上的编码配置是否会以某种方式影响此文本的呈现?
答案 0 :(得分:2)
源代码编码是非常相关的,而正在编译,正如OP在他的帖子中所说的那样。但是在编译之后,所有文字文本都存储为(修改的)UTF-8编码字符串。
所有字符串文字,类/方法/字段名称及其引用都存储在 UTF-8 编码的.class
文件的常量池中:
From the JVM spec (for Java version 1.7):
4.4.7。 CONSTANT_Utf8_info结构
CONSTANT_Utf8_info结构用于表示常量字符串 值:
[...]
字符串内容以修改后的UTF-8编码。修改了UTF-8 对字符串进行编码,使得代码点序列仅包含 非空ASCII字符只能使用每个字节1个字节来表示 代码点,但Unicode代码空间中的所有代码点都可以 表示。
因此,一旦编译了源代码,它就会以已知的字符编码(UTF-8)存储,您不再需要指定源文件编码。
通常,第4.4 of the JVM specification节解释了常量池的工作原理,字符串,类/字段/方法名称等由CONSTANT_Utf8_info
结构表示。
答案 1 :(得分:0)
在内部,java总是在String对象中使用UTF-16,因此它“不知道”源代码中使用的编码。
要自己确认一下,看一下String class的源代码,没有关于编码的信息。
答案 2 :(得分:0)
Java故意区分二进制数据(byte,Input / OutputStream)和Unicode(String,Reader / Writer),因此可以使用和组合任何脚本。因此,.class文件包含文本常量为UTF-8,内部在内存中,String和char为UTF-16。
通过这种方式,java实际上是最清晰的编码感知语言之一,其中不是事实,java源可以是任何编码,默认为平台编码,并且编译需要给予相同的编码(或默认为同一个)。
现在有人看到将源和编译器的编码指定为UTF-8的项目。