1. Pendahuluan
Saat menganalisis sebanding dan komparator, metode compareto dari kelas string dianalisis. String yang mendasarinya menggunakan array char [] untuk menyimpan elemen. Saat membandingkan, karakter dari dua string dibandingkan, dan karakter disimpan dengan char. Pada saat ini, saya tiba -tiba berpikir bahwa bisa chars di Java Store China? Kemudian saya menemukan bahwa tidak apa -apa, dan ini juga mengarah pada format pengkodean karakter di Java.
2. Format Penyimpanan Java
Di Java, kode berikut memperoleh berbagai format pengkodean karakter 'Zhang'.
Impor java.io.unsupportedEncodingException; tes kelas publik {public static string getCode (konten string, format string) melempar UnsupportedencodingException {byte [] bytes = content.getBytes (format); StringBuffer SB = StringBuffer baru (); untuk (int i = 0; i <bytes.length; i ++) {sb.append (integer.tohexstring (bytes [i] & 0xff) .touppercase ()+"); } return sb.toString (); } public static void main (string [] args) melempar UnsportedencodingException {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")); }}Hasil Menjalankan:
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
Catatan: Dari hasilnya, kita dapat mengetahui bahwa GBK dari karakter 'Zhang' sama dengan pengkodean GB2312, dan unicode sama dengan pengkodean UTF-16, tetapi pengkodean ISO-8859-1, Unicode, dan UTF-8 semuanya berbeda. Jadi, dalam JVM, format penyandian apa yang disimpan karakter 'Zhang'? Mari kita mulai analisis kami di bawah ini.
3. Jelajahi Ide Rahasia
1. Lihat format penyimpanan kumpulan konstan file .class
Kode tes adalah sebagai berikut
tes kelas publik {public static void main (string [] args) {string str = "zhang"; }}Gunakan tes javap -Verbose.class untuk dekompilasi dan situasi pengumpulan konstan adalah sebagai berikut:
Kemudian gunakan WinHex untuk membuka file kelas dan menemukan bahwa karakter 'Zhang' disimpan di kumpulan konstan sebagai berikut
Catatan: Dua di atas dapat disimpan dalam file kelas dalam format UTF-8.
Tetapi apakah dalam format UTF-8 saat runtime? Lanjutkan perjalanan eksplorasi kami.
2. Cari tahu dalam program ini
Gunakan kode berikut
tes kelas publik {public static void main (string [] args) {string str = "zhang"; System.out.println (integer.tohexstring (str.codepointat (0)). Touppercase ()); }}Hasil Menjalankan:
5f20
Catatan: Berdasarkan hasilnya, kita tahu bahwa saat runtime, JVM menggunakan format UTF-16 untuk penyimpanan. UTF-16 umumnya disimpan dengan 2 byte. Jika dua byte ditemui, itu akan diwakili oleh 4 byte. Akan ada artikel lain untuk memperkenalkannya nanti. Ketika kami memeriksa kode sumber kelas karakter, kami akan menemukan bahwa itu adalah kode menggunakan UTF-16, dan kami menemukan jawaban yang kami inginkan dari kedua sisi.
3. Bisakah jenis char disimpan dalam bahasa Cina?
Berdasarkan eksplorasi di atas, kita sudah tahu bahwa karakter dalam file kelas Java dikodekan dalam UTF-8, dan disusun dan disimpan dalam UTF-16 saat menjalankan JVM. Karakter 'Zhang' dapat diwakili oleh dua byte, dan Char juga dua byte di Java, sehingga dapat disimpan.
4. Ringkasan
Setelah analisis di atas, kita tahu:
1. Karakter dikodekan dalam file kelas dalam format UTF-8, dan dikodekan dalam format UTF-16 saat menjalankan JVM.
2. Jenis char adalah dua byte dan dapat digunakan untuk menyimpan bahasa Cina.
Selama panggilan ini, saya membaca banyak informasi tentang karakter, dan saya mendapat banyak manfaat dan menemukannya sangat menarik. Saya akan membagikannya berikutnya, jadi saya akan memberikannya pengantar singkat tentang masalah pengkodean dan pengkodean di Java. Pantau terus