1. Prefacio
Al analizar el comparable y el comparador, se analizó el método Compareto de la clase de cadena. La cadena subyacente usa una matriz Char [] para almacenar elementos. Al compararse, se comparan los caracteres de dos cadenas y los caracteres se almacenan con Char. ¿En este momento, de repente pensé que puede chars en Java Store Chinese? Más tarde descubrí que está bien, y esto también conduce al formato de codificación de personajes en Java.
2. Formato de almacenamiento Java
En Java, el siguiente código obtiene varios formatos de codificación del personaje 'Zhang'.
import java.io.unsupportedenCodingException; test public class {public static String getCode (String Content, Format de cadena) lanza UnspportedEnCodingException {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) lanza sin apoyoguredEncodingException {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")); }}Resultados de ejecución:
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
Nota: De los resultados, podemos saber que el GBK del personaje 'Zhang' es el mismo que la codificación GB2312, y el Unicode es el mismo que la codificación UTF-16, pero su codificación ISO-8859-1, Unicode y UTF-8 son diferentes. Entonces, en JVM, ¿qué formato de codificación se almacena el personaje 'Zhang'? Comencemos nuestro análisis a continuación.
3. Explore las ideas secretas
1. Ver el formato de almacenamiento del grupo .class constante del archivo
El código de prueba es el siguiente
prueba de clase pública {public static void main (string [] args) {String str = "zhang"; }}Use la prueba Javap -verbosa. Clase para la descompilación y la situación de agrupación constante es la siguiente:
Luego use Winhex para abrir el archivo de clase y descubra que el personaje 'Zhang' se almacena en el grupo constante de la siguiente manera
Nota: Los dos anteriores se pueden almacenar en el archivo de clase en formato UTF-8.
¿Pero está en formato UTF-8 en tiempo de ejecución? Continuar nuestro viaje de exploración.
2. Averigüe en el programa
Use el siguiente código
prueba de clase pública {public static void main (string [] args) {String str = "zhang"; System.out.println (integer.tohexString (str.codePointat (0)). ToupperCase ()); }}Resultados de ejecución:
5F20
Nota: Según los resultados, sabemos que en tiempo de ejecución, el JVM usa el formato UTF-16 para el almacenamiento. UTF-16 generalmente se almacena con 2 bytes. Si se encuentran dos bytes, estará representado por 4 bytes. Habrá otro artículo para presentarlo más tarde. Cuando verificamos el código fuente de la clase de caracteres, encontraremos que es el codificado usando UTF-16, y encontramos la respuesta que queremos de ambos lados.
3. ¿Se puede almacenar el tipo de char en chino?
Según la exploración anterior, ya sabemos que los personajes de los archivos de clase Java están codificados en UTF-8, y están codificados y almacenados en UTF-16 al ejecutar el JVM. El personaje 'Zhang' puede estar representado por dos bytes, y Char también es dos bytes en Java, por lo que puede almacenarse.
4. Resumen
Después del análisis anterior, sabemos:
1. Los caracteres están codificados en el archivo de clase en formato UTF-8, y están codificados en el formato UTF-16 al ejecutar el JVM.
2. El tipo de char es dos bytes y se puede usar para almacenar chino.
Durante esta llamada, leí mucha información sobre los personajes, y me beneficié mucho y lo encontré particularmente interesante. Lo compartiré a continuación, así que le daré una breve introducción a los problemas de codificación y codificación en Java. Manténganse al tanto