Ao enfrentar um fluxo de bytes, seu significado real não pode ser conhecido sem especificar sua codificação.
Essa frase também deve ser o que sempre lembramos em nossas mentes ao enfrentar o problema de "personagem para byte, byte ao caráter". Caso contrário, problemas ilegais podem seguir.
De fato, a essência do problema ilegível é que a codificação e a decodificação não usa a mesma codificação. Se você entende esse princípio, é fácil resolver o problema ilegível.
Comumente usados em java são os seguintes:
1. A classe String usa a sequência do construtor (byte [] bytes) de byte []. A classe String fornece duas sobrecargas ao mesmo tempo (1) String (byte [] bytes, charset charset)
(2) String (byte [] bytes, string charsetName) é usado para especificar a codificação.
2. O GetBytes Function Byte [] getBytes () da classe String também possui as duas sobrecargas a seguir:
(1) byte [] getBytes (charset charset)
(2) byte [] getBytes (string charsetName)
Tudo o que não requer a codificação especificado é obtido usando o charset padrão da plataforma, que pode ser obtido usando o System.getProperty ("file.encoding"), charset.defaultcharset ().
3. A impressão da PrintStream (strings) também foi projetada para esse problema. Por esse motivo, o construtor do PrintStream não é apenas PrintStream (arquivo de arquivo) e PrintStream (arquivo de arquivo, string csn)
Caso contrário, os caracteres da sequência serão convertidos em bytes de acordo com a codificação de caracteres padrão da plataforma,
O DataOutputStream Construction não possui um método para especificar a codificação, mas fornece um writeutf (string str)
Dê os exemplos no início para ilustrar a necessidade de especificar a codificação:
Se uma página da web especificar a codificação como UTF-8, <meta http-equiv = "content-type" content = "text /html; charset = utf-8" />, existe um formulário na página, enviado a um servlet
Em seguida, o fluxo de bytes passado pelos caracteres inseridos pelo usuário está codificando de acordo com a codificação especificada. Por exemplo, se você inserir "Hello Hello", se for UTF-8, a transmissão é a seguinte:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, Vemos que cada um dos caracteres chineses a seguir usa 3 bytes, que podem ser usados para se referir ao conhecimento relevante do UTF-8.
Mas se a sua página especificar GBK, a transmissão será diferente:
[104, 101, 108, 108, 111, -60, -29, -70, -61]
Portanto, ao usar o request.getParameter no lado do servlet, ele deve ser chamado internamente
String S = new String (bytes, Response.getEncoding ()). Se sua resposta não definir a codificação, a codificação padrão nula será convertida em GBK para a plataforma Java e, em seguida, os chineses ficarão iluminados.
Portanto, para evitar o código ilegal, os sites JSP geralmente definem um filtro e todas as páginas e servets estão configurados para ter uma codificação unificada. Response.SetEncoding, Request.SetEncoding.
Inside Java String é um char [], que é uma unidade codificada com UTF-16 armazenada de 16 bits. Para esse fim, ao converter caracteres e strings em bytes e emiti -los em arquivos ou redes ou reverter fluxos de bytes lidos de arquivos ou redes para caracteres com significado prático, você deve entender qual é a codificação deles.
Algumas experiências
1. A classe String é sempre armazenada na codificação Unicode.
2. Preste atenção ao uso de string.getBytes ():
Se o parâmetro do conjunto de caracteres não estiver incluído, ele dependerá da codificação do conjunto de caracteres da JVM. Geralmente é unicode no Linux e GBK no Windows. (Se você deseja alterar a codificação padrão do conjunto de caracteres da JVM, use a opção -dfile.encodeing = utf -8 ao iniciar a JVM.
Por motivos de segurança, é recomendável sempre ligar para os parâmetros, por exemplo: String S; S.GetBytes ("UTF-8").
3. A classe Charset é muito útil.
(1) Charset.Encode está codificando, ou seja, codificando a sequência no formato de codificação do conjunto de caracteres que você especifica e emitindo uma matriz de bytes.
(2) Charset.Decode está decodificando, ou seja, decodificar uma matriz de bytes no formato de codificação do conjunto de caracteres que você o especifica e a produz em uma string.
Como exemplo:
String s = charset.defaultcharset (). DisplayName (); String s1 = "eu gosto de você, meu amor"; Bytebuffer bb1 = bytebuffer.wrap (s1.getbytes ("utf-8")); para (byte bt: bb1.array ()) {system.out.printf ("%x", bt); } // char [] Uso char [] charray = {'i', 'l', 'o', 'v', 'e', 'você'}; // Charbuffer Uso CharBuffer CB = CharBuffer.Wrap (Charray); // reposicionar ponteiro cb.flip (); String S2 = new String (Charray); // ByteBuffer Uso ByTeBuffer bb2 = charset.ForName ("UTF-8"). Encode (CB); // Use charset para codificar como um caractere especificado definido bytebuffer bb3 = charset.forname ("utf-8"). Encode (s1); byte [] b = bb3.array (); // Use o charset para decodificar como uma string de acordo com o caractere especificado definido bytebuffer bb4 = bytebuffer.wrap (b); String s2 = charset.ForName ("UTF-8"). Decode (BB4) .ToString ();