사람들이 토론 포럼에서 JSP에 표시되는 한자가 깨졌을 때 어떻게 해야 하는지, 요청을 통해 받은 사용자의 중국어 입력이 왜 깨졌는지, 데이터베이스에 쓴 한자가 왜 깨졌는지 등을 묻는 사람들을 종종 봅니다. 한자가 왜곡되는 것에 대한 질문입니다.
사실 이 문제는 매우 간단합니다. 한자든 일본어든 다른 2바이트 언어든 UTF-8로 처리하겠습니다.
(1) 요청의 더블바이트 텍스트가 좋습니다. 이제 전체 애플리케이션에서 UTF-8 인코딩을 사용하겠습니다. UTF-8을 선택한 이유는 Java가 기반이라는 것을 알고 있습니다. UTF-8 이상이므로 UTF-8을 선택하는 것이 옳습니다^_^
먼저 .java 및 .jsp 파일을 UTF-8 인코딩으로 저장합니다. 이전 파일이 UTF-8로 저장되지 않았는지 여부는 중요하지 않지만 이후의 모든 파일은 UTF-8로 저장하는 것이 좋습니다.
그리고 .jsp로 작성합니다: < %@page contentType="text/html; charset=UTF-8"%> 대신 < %@page contentType="text/html; charset=UTF-8"%>
그런 다음 web.xml에 다음 단락을 추가합니다.
<웹앱>
...
<필터>
<filter-name>문자 인코딩 설정</filter-name>
<filter-class>com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter</filter-class>
<초기화 매개변수>
<param-name>인코딩</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<필터 매핑>
<filter-name>문자 인코딩 설정</filter-name>
<url-패턴>/*</url-pattern>
</필터 매핑>
...
</web-app>
com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter의 코드는 다음과 같습니다.
package com.redv.projects.eduadmin.util.filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
공개 클래스 SetCharacterEncodingFilter
필터를 구현합니다.
protected String 인코딩 = null;
protected
FilterConfig filterConfig = null;
보호
부울 무시 = true;
this.filterConfig = null
}
public void doFilter(ServletRequest 요청, ServletResponse 응답,
FilterChain 체인) throws IOException, ServletException {
// 사용할 문자 인코딩을 조건부로 선택 및 설정
if (무시 || (request.getCharacterEncoding() == null)) {
문자열 인코딩 = selectEncoding(요청);
if (인코딩 != null) {
request.setCharacterEncoding(encoding); //이것이 작동하는 것입니다. 하하, 이 요청의 본문에 사용된 문자 인코딩의 이름을 재정의합니다. 이 메서드는 getReader(를 사용하여 요청 매개변수를 읽거나 입력을 읽기 전에 호출되어야 합니다. ).
}
}
// 다음 필터로 제어를 전달합니다.
chain.doFilter(요청, 응답);
}
public void init(FilterConfig filterConfig)는 ServletException을 발생시킵니다. {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
문자열 값 = filterConfig.getInitParameter("ignore");
if (값 == null) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("true")) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("yes")) {
this.ignore = true;
}
또 다른 {
this.ignore = 거짓;
}
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding)
}
}
이러한 방식으로 요청 요청은 UTT-8로 인코딩되며 JSP 프로그램에서 사용할 수 있습니다. request.getParameter("myKey" ) 다음과 같이 대신 UTF-8로 인코딩된 문자열을 직접 가져올 수 있습니다. new String(request.getParameter("myKey").getBytes("ISO-8859-1"), "GBK") 잘못된 문자를 해결합니다. http://www.devdao.com/
(2) 데이터베이스에서 처리되는 더블바이트 텍스트 http://www.upas.org/java/DatabaseEncodingProblemSolution/
또 다른 하나는 데이터베이스에 쓰는 문제입니다. 우리는 mysql을 사용할 때 다음 URL을 사용하여 중국어 문자 인코딩 문제를 처리할 수 있다는 것을 알고 있습니다: jdbc:mysql://localhost:3306/upas?useUnicode=true&characterEncoding=gb2312,
그렇다면 mysql처럼 해결할 수 없는 문제는 어떻게 해야 할까요? 매번 이렇게 써야 할까요?
import java.sql.*;
Class.forName("org.gjt.mm.mysql.Driver");
연결 콘 = null;
준비된 진술 pstmt = null;
결과 집합 rs = null;
노력하다 {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
pstmt = con.prepareStatement("tbl1에서 f3, f4를 선택하세요. 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();
문자열 f3, f4;
동안(rs.next()) {
f3 = new String(rs.getString(1).getBytes("ISO-8859-1"), "GBK");
f4 = new String(rs.getString(2).getBytes("ISO-8859-1"), "GBK");
}
}
마지막으로 {
//리소스 닫기
...
}
실제로 다음과 같이 작성할 수 있습니다.
import java.sql.*;
import com.redv.sql.encoding.*;
Class.forName("org.gjt.mm.mysql.Driver");
연결 콘 = null;
준비된 진술 pstmt = null;
결과 집합 rs = null;
노력하다 {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
//데이터베이스 연결 인스턴스를 인수합니다.
부울 코딩 = true;
EncodingConnectioncodingConnection = new EncodingConnection(con, 코딩, "ISO-8859-1", "GBK");
//인계 후 데이터베이스 연결 인스턴스를 가져옵니다. 이미 EncodingConnection에 의해 다시 패키징된 인스턴스인 con을 직접 사용합니다.
con = 코딩Connection.getConnection();
pstmt = con.prepareStatement("tbl1에서 f3, f4를 선택하세요. WHERE f1 = ? AND f2 = ?");
pstmt.setString(1, f1);
pstmt.setString(2, f2);
rs = pstmt.executeQuery();
문자열 f3, f4;
동안(rs.next()) {
f3 = rs.getString(1);
f4 = rs.getString(2);
}
}
마지막으로 {
//리소스 닫기
...
}
자, 데이터베이스 연결이 이루어지는 곳에서 약간만 수정하면 됩니다. 속성에 매개변수로 저장하고 코딩의 부울 값을 변경하여 자동 인코딩 변환을 사용할지 여부를 설정할 수도 있습니다. 종종 우리는 데이터베이스 클래스를 사용하여 데이터베이스 연결을 얻는 getConnection을 캡슐화하여 javax.sql.DataSource에서 데이터베이스 연결을 얻을 수 있습니다. 현재로서는 인코딩 변환 코드를 추가하기 위해 rs.setString() 및 rs.getString()이 사용되는 모든 위치를 검색하는 대신 데이터베이스 클래스만 수정하면 됩니다. con.createStatment() 문을 사용하는 경우에도 SQL 문에 중국어 문자나 기타 더블바이트 문자가 포함되어 있어도 문제가 없습니다.
SELECT 이름, 성별 FROM 학생 테이블 WHERE 클래스 LIKE '%computer%'