无论如何要在 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.
所以我有这个简单的代码:
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.