Al enfrentar una corriente de bytes, su significado real no se puede conocer sin especificar su codificación.
Esta oración también debería ser lo que siempre recordamos en nuestras mentes cuando enfrentamos el problema del "carácter a byte, byte to carácter". De lo contrario, pueden seguir problemas confusos.
De hecho, la esencia del problema confuso es que la codificación y la decodificación no usan la misma codificación. Si comprende este principio, es fácil resolver el problema confuso.
Comúnmente usado en Java son los siguientes:
1. La clase de cadena usa la cadena de constructor (byte [] bytes) de byte []. La clase de cadena proporciona dos sobrecargas al mismo tiempo (1) cadena (byte [] bytes, charset charset)
(2) String (byte [] bytes, string charsetName) se usa para especificar la codificación.
2. La función getBytes byte [] getBytes () de la clase de cadena también tiene las siguientes dos sobrecargas:
(1) byte [] getbytes (charset charset)
(2) Byte [] GetBytes (String CharSetName)
Todo lo que no requiere la codificación especificada se obtiene utilizando el charset predeterminado de la plataforma, que se puede obtener usando System.GetProperty ("File.Encoding"), Charset.DefaultCharset ().
3. PrintStream's Print (String S) también está diseñada para este problema. Por este motivo, el constructor de printStream no es solo printStream (archivo de archivo) y printStream (archivo de archivo, cadena CSN)
De lo contrario, los caracteres de la cadena se convierten en bytes de acuerdo con la codificación de caracteres predeterminada de la plataforma,
DataOutputStream Construction no tiene un método para especificar la codificación, pero proporciona un WriteUtf (String STR)
Dé los ejemplos al principio para ilustrar la necesidad de especificar la codificación:
Si una página web especifica la codificación como UTF-8, <meta http-oquiv = "content-type" content = "text /html; charset = utf-8" />, hay un formulario en la página, enviado a un servlet
Luego, la corriente de byte pasada por los caracteres ingresados por el usuario está codificando de acuerdo con la codificación especificada. Por ejemplo, si ingresa "hola hola", si es UTF-8, entonces el transmitido es el siguiente:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, Vemos que cada uno de los siguientes caracteres chinos usa 3 bytes, que pueden usarse para referirse al conocimiento relevante de UTF-8.
Pero si su página especifica GBK, la transmisión será diferente:
[104, 101, 108, 108, 111, -60, -29, -70, -61]
Por lo tanto, al usar request.getParameter en el lado del servlet, debe llamarse internamente
Cadena S = nueva cadena (bytes, respuesta.getEncoding ()). Si su respuesta no establece la codificación, entonces la codificación predeterminada NULL se convertirá a GBK para la plataforma Java, y luego los chinos se volverán confundidos.
Por lo tanto, para evitar el código de confusión, los sitios JSP generalmente establecen un filtro, y todas las páginas y servetas tienen una codificación unificada. Response.setEncoding, request.setEncoding.
Dentro de Java String hay un char [], que es una unidad codificada con UTF-16 almacenado de 16 bits. Con este fin, al convertir caracteres y cadenas en bytes y generarlos en archivos o redes, o revertir las secuencias de bytes leídos de archivos o redes a caracteres con importancia práctica, debe comprender cuál es su codificación.
Algunas experiencias
1. La clase de cadena siempre se almacena en la codificación unicode.
2. Presta atención al uso de String.getBytes ():
Si el parámetro de conjunto de caracteres no está incluido, dependerá de la codificación del conjunto de caracteres del JVM. Generalmente es unicode en Linux y GBK en Windows. (Si desea cambiar la codificación del conjunto de caracteres predeterminado del JVM, use la opción -dfile.encodeing = UTF -8 al iniciar el JVM.
Por razones de seguridad, se recomienda llamar siempre con los parámetros, por ejemplo: String S; S.getBytes ("UTF-8").
3. La clase de charset es muy útil.
(1) Charset.Engode está codificando, es decir, codificando la cadena en el formato de codificación del conjunto de caracteres que especifique y emite una matriz de bytes.
(2) Charset.Decode está decodificando, es decir, decodifique una matriz de bytes en el formato de codificación del conjunto de caracteres que especifique y lo genera en una cadena.
Como ejemplo:
Cadena s = charset.defaultcharset (). DisplayName (); String S1 = "Me gustas, mi amor"; Bytebuffer bb1 = bytebuffer.wrap (s1.getbytes ("utf-8")); para (byte bt: bb1.array ()) {system.out.printf ("%x", bt); } // char [] use char [] charray = {'i', 'l', 'o', 'v', 'e', 'you'}; // Uso de Charbuffer Charbuffer CB = Charbuffer.wrap (Charray); // reposicionar puntero cb.flip (); Cadena s2 = nueva cadena (Charray); // Uso de ByteBuffer ByteBuffer bb2 = charset.forname ("UTF-8"). Code (CB); // Use Charset para codificar como un conjunto de caracteres especificado ByteBuffer bb3 = charset.forname ("UTF-8"). Code (S1); byte [] b = bb3.array (); // Use Charset para decodificar como una cadena de acuerdo con el conjunto de caracteres especificado ByteBuffer bb4 = bytebuffer.wrap (b); Cadena s2 = charset.forname ("utf-8"). Decode (bb4) .ToString ();