1. Vorwort
Bei der Analyse vergleichbarer und Vergleichs wurde die Vergleichsmethode der String -Klasse analysiert. Die zugrunde liegende Zeichenfolge verwendet ein Char [] -Array, um Elemente zu speichern. Beim Vergleich werden die Charaktere von zwei Saiten verglichen und die Charaktere mit char gespeichert. Zu diesem Zeitpunkt dachte ich plötzlich, dass Chinese in Java -Laden chinesisch sein kann? Später stellte ich fest, dass es in Ordnung ist, und dies führt auch zum Codierungsformat von Charakteren in Java.
2. Java -Speicherformat
In Java erhält der folgende Code verschiedene Codierungsformate des Zeichens 'Zhang'.
Importieren Sie java.io.unsupportedenCodingException; public class test {public static String getCode (String -Inhalt, String -Format) löscht nicht supportedenCodingException {byte [] bytes = content.getBytes (Format); StringBuffer sb = new StringBuffer (); für (int i = 0; i <bytes.length; i ++) {sb.Append (Integer.tohexString (Bytes [i] & 0xff) .touppercase ()+""); } return sb.toString (); } public static void main (String [] args) löst nicht supportedenCodingException aus {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"); }}Auslaufergebnisse:
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
Hinweis: Aus den Ergebnissen können wir wissen, dass die GBK des Charakters 'Zhang' die gleiche wie die GB2312-Codierung ist und der Unicode mit der UTF-16-Codierung identisch ist, aber die ISO-8859-1, Unicode und UTF-8-Codierung sind alle unterschiedlich. Also, in JVM, welches Codierungsformat ist das Charakter 'Zhang' gespeichert? Beginnen wir unsere Analyse unten.
3. Erforschen Sie die geheimen Ideen
1. Sehen Sie sich das Speicherformat des konstanten Pools der .class -Datei an
Der Testcode ist wie folgt
public class test {public static void main (String [] args) {String str = "zhang"; }}Verwenden Sie Javap -VERBOSE -Test.Class zur Dekompilierung und die konstante Pooling -Situation lautet wie folgt:
Verwenden Sie dann Winhex, um die Klassendatei zu öffnen und festzustellen, dass das Zeichen "Zhang" wie folgt im konstanten Pool gespeichert ist
Hinweis: Die beiden oben genannten können in der Klassendatei im UTF-8-Format gespeichert werden.
Aber ist es zur Laufzeit im UTF-8-Format? Setzen Sie unsere Erkundungsreise fort.
2. Finden Sie es im Programm heraus
Verwenden Sie den folgenden Code
public class test {public static void main (String [] args) {String str = "zhang"; System.out.println (Integer.tohexString (Str.CodePointat (0)). Touppercase ()); }}Auslaufergebnisse:
5f20
Hinweis: Basierend auf den Ergebnissen wissen wir, dass die JVM zur Laufzeit das UTF-16-Format für die Speicherung verwendet. UTF-16 wird im Allgemeinen mit 2 Bytes gespeichert. Wenn zwei Bytes auftreten, wird es durch 4 Bytes dargestellt. Es wird einen weiteren Artikel geben, um es später vorzustellen. Wenn wir den Quellcode der Zeichenklasse überprüfen, werden wir feststellen, dass er mit UTF-16 codiert ist, und wir haben die gewünschte Antwort von beiden Seiten gefunden.
3. Kann der Char -Typ auf Chinesisch gespeichert werden?
Basierend auf der obigen Erkundung wissen wir bereits, dass die Zeichen in Java-Klassendateien in UTF-8 codiert sind und beim Ausführen der JVM in UTF-16 codiert und gespeichert werden. Der Charakter 'Zhang' kann durch zwei Bytes dargestellt werden, und Char ist auch zwei Bytes in Java, sodass er gespeichert werden kann.
4. Zusammenfassung
Nach der obigen Analyse wissen wir:
1. Zeichen werden in der Klassendatei im UTF-8-Format codiert und im UTF-16-Format beim Ausführen der JVM codiert.
2. Der Char -Typ ist zwei Bytes und kann zur Aufbewahrung von Chinesen verwendet werden.
Während dieses Anrufs habe ich viele Informationen über Charaktere gelesen, und ich habe viel davon profitiert und fand es besonders interessant. Ich werde es als nächstes teilen, also werde ich ihm eine kurze Einführung in die Probleme der Codierung und Codierung in Java geben. Bleiben Sie dran