1. Préface
Lors de l'analyse comparable et du comparateur, la méthode de comparaison de la classe de chaîne a été analysée. La chaîne sous-jacente utilise un tableau CHAR [] pour stocker des éléments. En comparant, les caractères de deux chaînes sont comparés et les personnages sont stockés avec Char. À cette époque, j'ai soudainement pensé que les caractères dans le magasin Java Store chinois? Plus tard, j'ai trouvé que ça va, et cela conduit également au format de codage des personnages en Java.
2. Format de stockage Java
En Java, le code suivant obtient divers formats de codage du personnage «Zhang».
Importer java.io.unSupportEDenCcodingException; public class test {public static string getCode (String Content, String Format) lève unpportDenCcodingException {byte [] bytes = contenu.getBytes (format); StringBuffer sb = new StringBuffer (); pour (int i = 0; i <bytes.length; i ++) {sb.append (Integer.tohexString (bytes [i] & 0xff) .toupperase () + ""); } return sb.toString (); } public static void main (String [] args) lève unportdencodingException {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")); }}Résultats en cours:
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
Remarque: D'après les résultats, nous pouvons savoir que le GBK du personnage «Zhang» est le même que le codage GB2312, et l'unicode est le même que le codage UTF-16, mais son codage ISO-8859-1, Unicode et UTF-8 sont tous différents. Donc, dans JVM, quel format d'encodage est-il stocké le personnage «Zhang»? Commençons notre analyse ci-dessous.
3. Explorez les idées secrètes
1. Afficher le format de stockage du pool constant du fichier .class
Le code de test est le suivant
Classe publique Test {public static void main (String [] args) {String str = "zhang"; }}Utilisez Javap -Verbose Test.Class pour la décompilation et la situation de mise en commun constante est la suivante:
Ensuite, utilisez Winhex pour ouvrir le fichier de classe et constatez que le personnage «Zhang» est stocké dans le pool constant comme suit
Remarque: les deux ci-dessus peuvent être stockés dans le fichier de classe au format UTF-8.
Mais est-ce au format UTF-8 au moment de l'exécution? Continuez notre voyage d'exploration.
2. Découvrez dans le programme
Utilisez le code suivant
Classe publique Test {public static void main (String [] args) {String str = "zhang"; System.out.println (Integer.tohexString (str.codepointat (0)). ToupperCase ()); }}Résultats en cours:
5f20
Remarque: Sur la base des résultats, nous savons qu'au moment de l'exécution, le JVM utilise le format UTF-16 pour le stockage. L'UTF-16 est généralement stocké avec 2 octets. Si deux octets sont rencontrés, il sera représenté par 4 octets. Il y aura un autre article pour le présenter plus tard. Lorsque nous vérifions le code source de la classe de caractères, nous constatons que c'est le codé à l'aide de l'UTF-16, et nous avons trouvé la réponse que nous voulons des deux côtés.
3. Le type de char peut-il être stocké en chinois?
Sur la base de l'exploration ci-dessus, nous savons déjà que les caractères des fichiers de classe Java sont codés dans UTF-8, et sont codés et stockés dans UTF-16 lors de l'exécution du JVM. Le personnage «Zhang» peut être représenté par deux octets, et Char est également deux octets en Java, donc il peut être stocké.
4. Résumé
Après l'analyse ci-dessus, nous savons:
1. Les caractères sont codés dans le fichier de classe au format UTF-8 et sont codés au format UTF-16 lors de l'exécution du JVM.
2. Le type de char est de deux octets et peut être utilisé pour stocker le chinois.
Au cours de cet appel, j'ai lu beaucoup d'informations sur les personnages, et j'ai beaucoup profité et je l'ai trouvé particulièrement intéressant. Je vais le partager ensuite, donc je vais lui donner une brève introduction aux questions d'encodage et d'encodage en Java. Restez à l'écoute