【问题标题】:Is there anyway to change the encoding of String for compile time in Java?无论如何在Java中更改String的编码以进行编译?
【发布时间】:2016-04-27 14:12:53
【问题描述】:

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

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 文件?

【问题讨论】:

  • 这个帖子可能会有所帮助:stackoverflow.com/questions/361975/…
  • @KonstantinYovkov 它有什么关系?我的问题是关于编译时的,那个问题是关于运行时的。
  • 你读得很快 :) 其中一个答案建议你可以设置默认字符编码,方法是将JAVA_TOOL_OPTIONS 环境变量设置为-DfileEncoding=UTF-32
  • osx 在哪里可以找到 JAVA_TOOL_OPTIONS?
  • 可能你必须创建一个同名的环境变量并设置它的值。玩一下这个,并更仔细地研究这个JAVA_TOOL_OPTIONS - 至少,我只是建议你可以做什么,但不知道这是否会 100% 起作用。

标签: java unicode encoding utf-8 utf-32


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,我明白了。那么在我的情况下,它会在运行时将修改后的 UTF-8 转换为 UTF-32 吗?
  • @KorayTugay 实际上在加载类时会从常量池条目生成一个字符串对象(将 UTF-8 转换为 UCS-2),当您调用 String.getBytes() 时,它会将字符串转换为 UTF- 32 字节,使用您的默认编码。
猜你喜欢
  • 1970-01-01
  • 2022-06-12
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多