2016-01-21 54 views
3

所以我有这个简单的代码:有没有办法在Java中编译时改变String的编码?

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

+0

大概这个线程可能会有帮助:http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding –

+0

@KonstantinYovkov它甚至有什么关系?我的问题是编译时,这个问题是关于运行时。 –

+0

你读得很快:)其中一个答案表明,你可以设置一个默认的字符编码,通过设置'JAVA_TOOL_OPTIONS'环境变量为'-DfileEncoding = UTF-32' –

回答

3

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

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

因此常量池中字符串的编码始终为modified UTF-8

+0

嗯,我明白了。所以它在我的情况下在运行时将修改后的UTF-8转换为UTF-32呢? –

+0

@KorayTugay实际上,当类加载时,它会从常量池条目(将UTF-8转换为UCS-2)生成一个String对象,并且当您调用String.getBytes()时,它将使用字符串转换为UTF-32字节你的默认编码。 – wero

相关问题