无论如何要在 Java 中更改编译时字符串的编码?

Is there anyway to change the encoding of String for compile time in Java?

所以我有这个简单的代码:

public class FooBar {
    public static void main(String[] args) {
        String foo = "ğ";
        System.out.println(foo.getBytes().length);
    }
}

然后让我编译它 运行 它:

$ javac FooBar.java
$ java -Dfile.encoding=UTF-32 FooBar
4

好吧,我对一个字符在一个字符串中占用 4 个字节并不感到惊讶,因为我在 运行 编译程序时告诉 Java 使用 UTF-32 编码。

让我们尝试 运行使用 UTF-8 编码编译程序:

$ java -Dfile.encoding=UTF-8 FooBar
2

一切似乎都很好。

目前 class 文件 (FooBar.class) 是 451 字节 。我将这样更改代码:

public class FooBar {
    public static void main(String[] args) {
        String foo = "ğğ";
        System.out.println(foo.getBytes().length);
    }
}

再次编译,看到我盘中的文件长度为:453字节.

很明显,文件本身是以UTF-8编码存储在磁盘中的。如果我 运行 这个 .class 文件现在使用 UTF-32 编码:

$ java -Dfile.encoding=UTF-32 FooBar
8

一切看起来都很好,但是,有没有告诉编译器使用 UTF-32 对 String 字符编码 .class 文件?

系统 属性 file.encoding 确定默认字符集,但未被编译器使用。

Java class 文件有一个定义的二进制数据结构,不能更改(除非你编写自己的编译器和 classloader)。

因此字符串在常量池中的编码总是modified UTF-8.