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

时间:2014-05-24 10:09:18

标签: java javac

我知道用Java加载文件而不指定要使用的编码是平台相关的。但我的问题是关于 .java源文件本身包含的文本:用于这些文件的编码是否仍然与编译后相关

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

private String encodingTest = "Bœuf fûmé";

如果我使用-encoding Cp1252进行编译,那么结果.class中的文字会发生什么?编码仍然重要吗?或者编译时Java编码的编码是什么?

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

3 个答案:

答案 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的项目。