1。序文
Acparable and Comparatorを分析するとき、文字列クラスの比較方法を分析しました。基礎となる文字列は、char []配列を使用して要素を保存します。比較すると、2つの文字列の文字が比較され、文字はcharで保存されます。この時点で、私は突然、それがJavaストア中国語で請求できると思いましたか?後で私はそれが大丈夫であることがわかりました、そして、これはJavaのキャラクターのエンコード形式にもつながります。
2。Javaストレージ形式
Javaでは、次のコードでは、文字「Zhang」のさまざまなエンコード形式を取得します。
java.io.unsupportedencodingexception; public class test {public static string getcode(string content、string format)throws unsupportedencodingexception {byte [] bytes = content.getBytes(format); stringbuffer sb = new StringBuffer(); for(int i = 0; i <bytes.length; i ++){sb.append(integer.tohexstring(bytes [i]&0xff).touppercase()+""); } return sb.toString(); } public static void main(string [] args)throws unsupportedencodingexception {system.out.println( "gbk:" + getcode( "zhang"、 "gbk")); System.out.println( "gb2312:" + getCode( "zhang"、 "gb2312")); System.out.println( "ISO-8859-1:" + getCode( "Zhang"、 "ISO-8859-1")); system.out.println( "unicode:" + getCode( "zhang"、 "unicode")); System.out.println( "utf-16:" + getCode( "zhang"、 "utf-16")); System.out.println( "utf-8:" + getCode( "zhang"、 "utf-8")); }}実行結果:
GBK:D5 C5 GB2312:D5 C5 ISO-8859-1:3F Unicode:Fe FF 5F 20 UTF-16:FE FF 5F 20 UTF-8:E5 BC A0
注:結果から、キャラクター「Zhang」のGBKはGB2312エンコーディングと同じであり、UnicodeはUTF-16エンコーディングと同じであることがわかりますが、ISO-8859-1、Unicode、およびUTF-8エンコーディングはすべて異なります。それで、JVMでは、「Zhang」が保存されているキャラクター形式はどのようなエンコード形式ですか?以下に分析を始めましょう。
3。秘密のアイデアを探ります
1。.classファイル定数プールのストレージ形式を表示します
テストコードは次のとおりです
public class test {public static void main(string [] args){string str = "zhang"; }}逆コンパイルにjavap -verbose test.classを使用し、一定のプーリング状況は次のとおりです。
次に、WinHexを使用してクラスファイルを開き、キャラクター「Zhang」が次のように一定のプールに保存されていることがわかります
注:上記の2つは、UTF-8形式のクラスファイルに保存できます。
しかし、それは実行時にUTF-8形式ですか?探検の旅を続けます。
2。プログラムで調べてください
次のコードを使用します
public class test {public static void main(string [] args){string str = "zhang"; system.out.println(integer.tohexstring(str.codepointat(0))。touppercase()); }}実行結果:
5F20
注:結果に基づいて、実行時にJVMがStorageにUTF-16形式を使用することがわかっています。 UTF-16は通常、2バイトで保存されます。 2つのバイトが発生した場合、4バイトで表されます。後で紹介する別の記事があります。キャラクタークラスのソースコードを確認すると、UTF-16を使用してコード化されていることがわかり、両側から必要な答えが見つかりました。
3. charタイプは中国語に保存できますか?
上記の調査に基づいて、Javaクラスファイルの文字がUTF-8でエンコードされており、JVMを実行するとUTF-16でエンコードおよび保存されていることがすでにわかっています。キャラクター「Zhang」は2バイトで表すことができ、charはJavaの2バイトであるため、保存できます。
4。概要
上記の分析の後、私たちは知っています:
1。文字は、UTF-8形式のクラスファイルでエンコードされ、JVMを実行するときにUTF-16形式でエンコードされます。
2。charタイプは2バイトで、中国語の保存に使用できます。
この電話で、私はキャラクターに関する多くの情報を読みました、そして私は多くの利益を得て、それが特に興味深いと感じました。次に共有するので、Javaでのエンコードとエンコードの問題について簡単に紹介します。乞うご期待