Java juego de caracteres de codificación

Java juego de caracteres de codificación

Java juego de caracteres por defecto es el Unicode (dos bytes de bytes , un byte = 8 bits de bits ' )

se detalla:

Juego de caracteres de codificación

Unicode es un "conjunto de caracteres"; UTF-8 es "reglas que codifican" (el más ampliamente utilizado es un Unicode implementaciones)

Juego de caracteres: asignar un carácter único para cada ID (bits de código)

La codificación de reglas: reglas para convertir la secuencia de bits de código de bytes (con lo que se almacena)

 

 

Inglés / byte

Chino / byte

. 8-UTF (longitud variable)

1

3

UTF-16

2

3-4

GBK

1

2

ISO8859-1

1

1

Unicode

2

2 (también puntuacion)

ASCII

1

2

 

Java enfoque:

Hay dos aspectos de los problemas de codificación: JVM dentro y JVM exterior.

  1. compilador Java archivos se compilan para formar después de clase

Aquí Java archivo codificado puede haber variado ( puede ser UTF-8. (Común) ), el de Java compilador codificado automáticamente en estos Java producir el archivo de formato de codificación correcta leer la clase de archivos, donde la clase de código del archivo es Unicode de codificación (específicamente UTF-16 de codificación). Que completaron el UTF-8 codificación de archivo convertirse en una plataforma independiente .class archivos, el UTF-8 codifica dio vuelta en Unicode . Una vez compilado en .class archivos, que no se preocupan por lo que nuestra fuente de programas UTF-8 codificación

Así, en Java definición de un código de cadena de la cadena s = " caracteres ";
no importa antes de compilar java qué archivos que codifican, compilados en la clase más adelante, son todos iguales ---- Unicode codificado representación.

  2.JVM de codificación

En la JVM interna, el uso uniforme Unicode dijo caracteres desde la parte delantera de JVM mueve interior hacia el exterior (es decir, almacenado como el contenido de un archivo cuando el sistema de archivos), la transcodificación realizaron utilizando un esquema específico de codificación. Por lo tanto, se puede decir que toda la conversión de la codificación se produce sólo en el límite local, es decir, diferentes de entrada / flujos de salida en juego.

JVM carga la clase de archivo se lee cuando se utiliza Unicode codificar correctamente leer la clase de archivos, la definición original de la = "cadena s caracteres "; manifestación en memoria es el Unicode de codificación.

 

problema

En Java , el número de bytes de un carácter igual?

O una Q más detallada: En Java , un byte es igual al número de caracteres Inglés? Un número de caracteres chinos byte igual?

 

Java usos Unicode para representar los caracteres, el de Java uno de los Char es de 2 bytes, un chino o inglés caracteres Unicode codificaciones se contabilizan 2 bytes, pero si otra codificación, un número de bytes para cada carácter ocupa no se misma.

la validación del código de la siguiente manera:

pública  estáticas  vacíos principales (args String []) { 
    string cadena = "测" ;
    Char x = '测' ;
    byte [] byteStr = str.getBytes ();
    byte [] byteChar = charToByte (x); 
    System.out.println ( "byteStr:" + byteStr.length); // byteStr: 3 
    System.out.println ( "byteChar:" + byteChar.length); // byteChar: 2 
} 

// 通过移位获取Char类型的byte数组
pública  estática  byte [] charToByte ( Char c) {
     byte [] b = nuevo  byte [2]; 
    b [ 0] = ( byte ) ((C & 0xFF00) >> 8 ); 
    b [ 1] = ( byte ) (C & 0xFF );
    volver b; 
}

 

código de sistema de adquisición

System.out.println ( "la codificación por defecto del sistema:" + System.getProperty ( "file.encoding")); // consulta de resultados-8 UTF 
System.out.println ( "codificación de caracteres por defecto del sistema:" + Charset.defaultCharset ( )); // consulta los resultados UTF-8 
System.out.println ( "idioma predeterminado del sistema:" + System.getProperty ( "user.language")); // consulta de resultados zH

 

getBytes () método detallado

También se debe aclarar getBytes superior método utilizado ()

En Java en , Cadena de getBytes () método era un defecto del sistema array formato de codificación byte operativo. Esto significa que bajo diferentes sistemas operativos , las cosas retorno no es el mismo !

1.str.getBytes ();   si no lo hace paréntesis escritura juego de caracteres , a continuación, utiliza Sytem.getProperty ( "file.encoding"), que se codifica la imagen actual, 

2.str.getBytes ( "conjunto de caracteres"); // especificado charset , viniendo de almacenamiento subyacente Unicode código se analiza charset codificación matriz de formato de byte de realización 

3.String str = new String (str.getBytes ( "UTF-8"), "gbk")); // el byte de datos se ha analizado en gbk cadena de formato de codificación en la memoria es el gbk byte de formato de matriz en Unicode para pasar interactúan

 

extendido

 Q:

.getBytes "A" ( "Unicode"). longitud // número 4

Top've dijo un carácter Unicode ocupa dos bytes, ¿por qué no hay un 4 bytes 2 bytes?

¿Por qué Unicode  4 bytes

El uso para bucle a través de la resultante byte array (o utilizar el carácter a):

-2 -1 0 97 

 

Se encuentra en frente de una pluralidad  -2 -1, que en realidad es un byte BOM bandera. 

Unicode es un conjunto de caracteres, el Java utiliza directamente en Unicode seguirá al transcodificar UTF-16LE dividida, ya que UTF-16 en UTF-16LE y UTF-16BE , es decir, el ascendente hacia la izquierda y big endian por lo tanto, en la red durante la transmisión, no puede determinar lE o bE  secuencia, requiriendo así un endian complemento adicional BOM cabecera. BOM cabecera carácter es un carácter especial que Unicode codifica como el U- + la FEFF , llamado el carácter "CERO ANCHO  la no separación del espacio" , de acuerdo con RFC2781 3,2 sección proporciona que los dos primeros bytes FE FF refiere Big-Endian , comenzando con FF FE se llama little-endian .

 

La explicación utf-16: utf-16 realización comprende 2 Especies secuencia de bytes, Big Endian Endian y Little Endian orden de bytes :
UTF-16 Big Endian : FEFF ( ningún significado en UCS 2- en ) , en el que FEFF código de identificación es
UTF-16 Little endian : FFFE ( ningún significado en UCS 2- en ), java selección predeterminada Little endian endian

 

Por lo tanto, sólo tiene que utilizar Unicode palabras byte de conversión, es decir, de acuerdo con UTF-16LE manera de decodificar, añadir el suplemento de lista de materiales de dos bytes FF  FE .

solución:

Se puede utilizar la codificación UnicodeBigUnmarked

"a" .getBytes ( "UnicodeBigUnmarked"). longitud // 结果为2

 

referencia:

http://bbs.itheima.com/thread-101106-1-1.html

https://blog.csdn.net/lcfeng1982/article/details/6830584 

Supongo que te gusta

Origin www.cnblogs.com/scChen/p/12508571.html
Recomendado
Clasificación