所以我有这个简单的代码:
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。