1. Prefácio
Ao analisar comparável e comparador, o método compareto da classe String foi analisado. A string subjacente usa uma matriz de char [] para armazenar elementos. Ao comparar, os caracteres de duas cordas são comparados e os caracteres são armazenados com char. Neste momento, de repente pensei que os chars na loja de java chineses? Mais tarde, descobri que está tudo bem, e isso também leva ao formato de codificação de caracteres em Java.
2. Formato de armazenamento Java
Em Java, o código a seguir obtém vários formatos de codificação do personagem 'Zhang'.
importar java.io.unsupportEdEncodingException; public class Test {public static string getCode (conteúdo da string, formato de string) lança não suportesCodingingException {byte [] bytes = content.getBytes (formato); StringBuffer sb = new StringBuffer (); for (int i = 0; i <bytes.length; i ++) {sb.append (Integer.toHexString (bytes [i] e 0xff) .touppercase ()+""); } return sb.toString (); } public static void main (string [] args) lança 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")); }}Resultados em execução:
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: A partir dos resultados, podemos saber que o GBK do personagem 'Zhang' é o mesmo que a codificação de GB2312, e o Unicode é o mesmo que a codificação UTF-16, mas sua codificação ISO-8859-1, Unicode e UTF-8 são todos diferentes. Então, na JVM, qual formato codificador é o personagem 'Zhang' armazenado? Vamos começar nossa análise abaixo.
3. Explore as idéias secretas
1. Veja o formato de armazenamento do conjunto de constantes de arquivo .class
O código de teste é o seguinte
classe pública teste {public static void main (string [] args) {string str = "zhang"; }}Use Javap -verbose test.class para decompilação e a situação constante de agrupamento é a seguinte:
Em seguida, use o WINHEX para abrir o arquivo de classe e descobrir que o personagem 'Zhang' está armazenado no pool constante da seguinte maneira
Nota: Os dois acima podem ser armazenados no arquivo de classe no formato UTF-8.
Mas está no formato UTF-8 em tempo de execução? Continue nossa jornada de exploração.
2. Descubra no programa
Use o seguinte código
classe pública teste {public static void main (string [] args) {string str = "zhang"; System.out.println (Integer.toHexString (str.codePointat (0)). ToupPercase ()); }}Resultados em execução:
5F20
Nota: Com base nos resultados, sabemos que, em tempo de execução, a JVM usa o formato UTF-16 para armazenamento. O UTF-16 é geralmente armazenado com 2 bytes. Se dois bytes forem encontrados, ele será representado por 4 bytes. Haverá outro artigo para apresentá -lo mais tarde. Quando verificamos o código-fonte da classe de caracteres, descobriremos que é o codificado usando o UTF-16 e encontramos a resposta que queremos de ambos os lados.
3. O tipo de char pode ser armazenado em chinês?
Com base na exploração acima, já sabemos que os caracteres nos arquivos da classe Java são codificados no UTF-8 e são codificados e armazenados no UTF-16 ao executar a JVM. O personagem 'Zhang' pode ser representado por dois bytes, e Char também é dois bytes em Java, para que possa ser armazenado.
4. Resumo
Após a análise acima, sabemos:
1. Os caracteres são codificados no arquivo de classe no formato UTF-8 e são codificados no formato UTF-16 ao executar a JVM.
2. O tipo de char é de dois bytes e pode ser usado para armazenar chinês.
Durante essa chamada, li muitas informações sobre personagens e me beneficiei muito e achei particularmente interessante. Vou compartilhar a seguir, então darei uma breve introdução às questões de codificação e codificação em Java. Fique atento