Quando o servidor web recebe a solicitação http do cliente, ele criará um objeto de solicitação representando a solicitação e um objeto de resposta representando a resposta para cada solicitação. Como os objetos de solicitação e resposta representam solicitações e respostas, se quisermos obter os dados enviados pelo cliente, precisamos apenas encontrar o objeto de solicitação. Para enviar dados para o cliente, basta procurar o objeto de resposta.
Copie o código do código da seguinte forma:
pacote com.yyz.response;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema com saída em chinês
classe pública ResponseDemo estende HttpServlet {
public void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
String dados = "China";
OutputStream out=response.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); Este código envolve verificar a tabela de códigos duas vezes.
* Quando "China" muda de dados de caracteres para dados de bytes, a tabela de códigos gb2312 será consultada.
*Quando os dados são enviados ao navegador para exibição, a tabela de códigos precisa ser consultada novamente. A tabela de códigos consultada neste momento está relacionada às configurações do navegador.
*/
}
public void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
doGet(solicitação,resposta);
}
}
Resultados do teste quando a codificação do navegador está definida como GB2312:
Resultados do teste quando a codificação do navegador está definida como UTF-8:
Para tornar nosso site acessível a usuários estrangeiros, ao converter dados de caracteres em dados de bytes, devemos especificar a tabela de códigos de conversão como UTF-8. Mas neste momento, se o navegador for aberto com GB2312, caracteres ilegíveis aparecerão novamente. Embora esse problema de código distorcido possa ser resolvido alterando as configurações do navegador, ele não contribui para melhorar a experiência do usuário. Portanto, precisamos utilizar um programa para informar ao navegador qual tabela de códigos consultar para exibir os dados.
Copie o código do código da seguinte forma:
pacote com.yyz.response;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema com saída em chinês
classe pública ResponseDemo estende HttpServlet {
public void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
//No lado do servidor, de qual tabela de códigos os dados são gerados, então é necessário controlar com qual tabela de códigos o navegador é aberto.
String dados = "China";
response.setHeader("tipo de conteúdo", "text/html;charset=UTF-8");
OutputStream out=response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
doGet(solicitação,resposta);
}
}
Aprenda mais um truque:
Use a tag <meta> na linguagem HTML para controlar o comportamento do navegador.
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv simula o cabeçalho de resposta HTTP e diz ao navegador para abri-lo na tabela de códigos UTF-8. Os cabeçalhos de resposta reais têm precedência sobre os cabeçalhos de resposta simulados com http-equiv.
No desenvolvimento real, o servidor deve usar fluxos de caracteres para gravar dados de texto no navegador. No entanto, a tabela de códigos padrão do fluxo de caracteres obtida por meio do método de resposta getWriter é ISO8859-1. Não há codificação chinesa correspondente nesta tabela de códigos, portanto ela será alterada? A codificação correspondente é enviada ao navegador e, quando o navegador é aberto, fica cheio de pontos de interrogação. A tabela de códigos consultada pelo servidor no momento do envio dos dados pode ser modificada através do setCharacterEncoding de resposta.
Copie o código do código da seguinte forma:
pacote com.yyz.response;
importar java.io.IOException;
importar java.io.PrintWriter;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Problema com saída em chinês
classe pública ResponseDemo estende HttpServlet {
public void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
//No lado do servidor, de qual tabela de códigos os dados são gerados, então é necessário controlar com qual tabela de códigos o navegador é aberto.
String dados = "China";
response.setHeader("tipo de conteúdo", "text/html;charset=UTF-8");
resposta.setCharacterEncoding("UTF-8");
PrintWriter out = resposta.getWriter();
out.write(dados);
}
public void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
doGet(solicitação,resposta);
}
}
Existem alguns pequenos detalhes a serem observados aqui:
1.response.setCharacterEncoding("UTF-8"); precisa ser escrito na frente de PrintWriter out = response.getWriter();. É inútil definir a codificação depois de obter o fluxo de caracteres.
2.response.setHeader("content-type", "text/html;charset=UTF-8"); Existe uma maneira mais simples de escrever response.setContentType("text/html;charset=UTF-8");.
3.response.setContentType("text/html;charset=UTF-8"); Na verdade, esse código tem duas funções: notificar a resposta para saída em UTF-8 e o navegador para abrir em UTF-8. Isso é equivalente a response.setHeader("content-type", "text/html;charset=UTF-8"); e response.setCharacterEncoding("UTF-8");.
4. Através da leitura acima, os leitores deverão ser capazes de entender por que a saída de response.getOutputStream.write(1) no navegador não é 1. Como o navegador é um editor de texto, após receber os dados, será necessário 1 para consultar a tabela de códigos e, em seguida, exibir os caracteres correspondentes. Se você deseja gerar números no navegador, você deve transformar os números em strings, response.getOutputStream.write((1+"").getBytes());.
Use OutputStream (fluxo de bytes) para enviar dados:
1.response.getOutputStream().write("China".getBytes());//Envia dados na codificação padrão
2.response.getOutputStream().write("China".getBytes("UTF-8"));//Envie dados na codificação UTF-8, o navegador (padrão GB2312) aparecerá ilegível
Solução:
2.1 Alterando o método de codificação do navegador: IE/"View"/"Encoding"/"UTF-8" (não aconselhável)
2.2 Informe o cliente sobre o método de codificação definindo o cabeçalho de resposta: response.setHeader("Content-type", "text/html;charset=UTF-8");//Informa o navegador sobre o tipo de dados e codificação
2.3 Simule cabeçalhos de solicitação por meio de meta tags: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 Através do seguinte método: response.setContentType("text/html;charset=UTF-8");