3

だから私はこの簡単なコードを持っています:

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

プログラムの実行時に Java に UTF-32 エンコーディングを使用するように指示したため、1 つの文字が String で 4 byes かかることに驚きはありません。

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 エンコーディングでディスクに保存されます。この .class ファイルを UTF-32 エンコーディングで実行すると、次のようになります。

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

すべて問題ないようですが、文字列文字に UTF-32 を使用して .class ファイルをエンコードするようにコンパイラに指示する方法はありますか?

4

1 に答える 1

3

システム プロパティfile.encodingはデフォルトの文字セットを決定しますが、コンパイラでは使用されません。

Java クラス ファイルには、変更できないバイナリ データ構造が定義されています (独自のコンパイラとクラスローダを作成する場合を除く)。

したがって、定数プール内の文字列のエンコーディングは常に変更された UTF-8です。

于 2016-01-21T11:16:19.723 に答える