无论如何都可以在 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

一切似乎都很好。

现在,当前类文件(FooBar.class)是451字节。我将像这样更改代码:

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

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

显然,文件本身以 UTF-8 编码存储在磁盘中。如果我现在使用 UTF-32 编码运行此.class文件:

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

好吧,一切似乎都很好,但是,无论如何要告诉编译器使用 UTF-32 对字符串字符对.class文件进行编码?

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

Java 类文件具有定义的二进制数据结构,无法更改(除非您编写自己的编译器和类加载器)。

因此,常量池中字符串的编码始终修改为 UTF-8。

最新更新