Muitas vezes vejo pessoas me perguntando em fóruns de discussão o que fazer se os caracteres chineses exibidos no JSP estiverem distorcidos, por que a entrada em chinês do usuário que recebo por meio da solicitação está distorcida, por que os caracteres chineses que escrevo no banco de dados estão distorcidos e outros perguntas sobre caracteres chineses sendo ilegíveis.
Na verdade, esse problema é muito simples, independentemente de serem caracteres chineses, japoneses ou algum outro idioma de byte duplo, iremos tratá-lo como UTF-8.
(1) O texto de byte duplo na solicitação é bom. Agora usaremos a codificação UTF-8 em todo o aplicativo. A razão pela qual o UTF-8 foi escolhido não é apenas pelos motivos acima. UTF-8.8 ou superior, então devemos estar certos ao escolher UTF-8^_^
Primeiro salvamos nossos arquivos .java e .jsp na codificação UTF-8. Não importa se os arquivos anteriores não foram salvos em UTF-8, mas é recomendado que todos os arquivos futuros sejam salvos em UTF-8.
E escreva em .jsp: < %@page contentType="text/html; charset=UTF-8"%> em vez de < %@page contentType="text/html; charset=UTF-8"%>
Em seguida, adicione o seguinte parágrafo ao web.xml:
<aplicativo web>
...
<filtro>
<filter-name>Definir codificação de caracteres</filter-name>
<filter-class>com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter</filter-class>
<parâmetro de inicialização>
<param-name>codificação</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filtro>
<mapeamento de filtro>
<filter-name>Definir codificação de caracteres</filter-name>
<url-padrão>/*</url-padrão>
</filter-mapping>
...
</web-app>
O código de com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter é o seguinte:
package com.redv.projects.eduadmin.util.filters
import java.io.IOException;
importar javax.servlet.Filter;
importar javax.servlet.FilterChain;
importar javax.servlet.FilterConfig;
importar javax.servlet.ServletException;
importar javax.servlet.ServletRequest;
importar javax.servlet.ServletResponse;
importar javax.servlet.UnavailableException;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
classe pública SetCharacterEncodingFilter
implementa Filtro {
codificação de string protegida = null;
configuração
de filtro protegida filterConfig = null;
boolean protegido ignorar = true
;
this.filterConfig = null
}
public void doFilter (solicitação ServletRequest, resposta ServletResponse,
Cadeia FilterChain) lança IOException, ServletException {
// Seleciona e define condicionalmente a codificação de caracteres a ser usada
if (ignorar || (request.getCharacterEncoding() == null)) {
Codificação de string = selectEncoding(solicitação);
if (codificação! = nulo) {
request.setCharacterEncoding(encoding); //Isso é o que está funcionando, haha, isso: Substitui o nome da codificação de caracteres usada no corpo desta solicitação. Este método deve ser chamado antes de ler os parâmetros da solicitação ou ler a entrada usando getReader(. ).
}
}
//Passa o controle para o próximo filtro
chain.doFilter(solicitação, resposta }
public
void init(FilterConfig filterConfig) lança ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("codificação");
Valor da string = filterConfig.getInitParameter("ignorar");
if (valor == nulo) {
isto.ignore = verdadeiro;
}
senão if (value.equalsIgnoreCase("true")) {
isto.ignore = verdadeiro;
}
senão if (value.equalsIgnoreCase("sim")) {
isto.ignore = verdadeiro;
}
outro {
isto.ignore = falso;
}
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
Desta
forma, nossa solicitação de solicitação é codificada em UTT-8 e podemos usá-la no programa JSP: request.getParameter("myKey
"
) Você pode obter diretamente a string codificada em UTF-8, em vez de assim: new String(request.getParameter("myKey").getBytes("ISO-8859-1"), "GBK") para resolver esses caracteres ilegíveis. http://www.devdao.com/
(2) Texto de byte duplo processado pelo banco de dados http://www.upas.org/java/DatabaseEncodingProblemSolution/
Outro é o problema de gravação no banco de dados. Sabemos que ao usar o mysql, podemos usar esta URL para lidar com o problema de codificação de caracteres chineses: jdbc:mysql://localhost:3306/upas?useUnicode=true&characterEncoding=gb2312,
Então, o que devemos fazer sobre aquelas coisas que não podemos resolver como o mysql? Deveríamos escrever assim sempre:
importar java.sql.*;
Class.forName("org.gjt.mm.mysql.Driver");
Conexão con = nulo;
PreparedStatement pstmt = null;
Conjunto de resultados rs = null;
tentar {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
pstmt = con.prepareStatement("SELECIONE f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
pstmt.setString(1, new String(f1.getBytes("GBK"), "ISO-8859-1");
pstmt.setString(2, new String(f2.getBytes("GBK"), "ISO-8859-1");
rs = pstmt.executeQuery();
Sequência f3, f4;
enquanto(rs.next()) {
f3 = nova String(rs.getString(1).getBytes("ISO-8859-1"), "GBK");
f4 = nova String(rs.getString(2).getBytes("ISO-8859-1"), "GBK");
}
}
finalmente {
//fecha recursos
...
}
Na verdade, podemos escrever assim:
importar java.sql.*;
importar com.redv.sql.encoding.*;
Class.forName("org.gjt.mm.mysql.Driver");
Conexão con = nulo;
PreparedStatement pstmt = null;
Conjunto de resultados rs = null;
tentar {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
//Assumir a instância de conexão com o banco de dados
codificação booleana = verdadeiro;
EncodingConnection codingConnection = new EncodingConnection(con, codificação, "ISO-8859-1", "GBK");
//Obter a instância de conexão com o banco de dados após assumir o controle. Use con diretamente no futuro, que já é uma instância reembalada por EncodingConnection.
con = codingConnection.getConnection();
pstmt = con.prepareStatement("SELECIONE f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
pstmt.setString(1,f1);
pstmt.setString(2, f2);
rs = pstmt.executeQuery();
Sequência f3, f4;
enquanto(rs.next()) {
f3 = rs.getString(1);
f4 = rs.getString(2);
}
}
finalmente {
//fecha recursos
...
}
Vamos ver, só precisamos modificá-lo um pouco onde obtemos a conexão com o banco de dados. Podemos até salvá-lo como um parâmetro nas propriedades e alterar o valor booleano da codificação para definir se devemos usar a conversão automática de codificação. Muitas vezes podemos usar uma classe Database para encapsular o getConnection que obtém a conexão com o banco de dados, para que possamos obter a conexão com o banco de dados de javax.sql.DataSource. Neste momento, precisamos apenas modificar nossa classe Database, em vez de procurar todos os locais onde rs.setString() e rs.getString() são usados para adicionar nosso código de conversão de codificação. Mesmo quando usamos a instrução con.createStatment(), não há problema, mesmo que nossa instrução sql contenha caracteres chineses ou outros caracteres de byte duplo:
SELECIONE nome, gênero FROM tabela de alunos WHERE classe LIKE '%computer%'