JSP 난 장 판 해결

전재 하 다  http://www.txdnet.cn/essay/view.jsp?tid=155&cid=2[color=red][/color]
제 가 JSP 난 장 판 을 해결 하 는 방법 에 대해 서 여러분 께 도움 이 되 었 으 면 좋 겠 습 니 다.
일단 저 는 UTF - 8 인 코딩 을 통일 적 으로 사용 하고 있 습 니 다.
Mysql 연결 문자
jdbc:mysql://YourMySqlServerIp:Port/YourDBName?
autoReconnect=true&useUnicode=true&characterEncoding=UTF8"......
mysql 데이터베이스 난 장 판 해결
데이터베이스 UTF 8 사용
jsp 파일 은 utf - 8 편집 으로 저장 해 야 합 니 다.
<%@pagecontentType="text/html;charset=UTF-8"....
<%@pagepageEncoding="UTF-8"%>
<%response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");%>
usebean 이나 라벨 을 사용 했다 면
tomcat 의 자체 encodeFilter 인 코딩 요청 은 UTF - 8 입 니 다.
ajax 의 get 은 JS 의 encodeURIComponent () 로 중국 어 를 UTF - 8 로 인 코딩 해 야 합 니 다.
post 값 을 전송 하려 면 JS 인 코딩 을 사용 할 수 있 습 니 다. 중국 어 는 UTF - 8 입 니 다.
XmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
POSTAJAX 용 UTF - 8 인 코딩 설정
servlet 와 javabean 을 컴 파일 할 때 javac - encodingUTF - 8 - source 1.5 - target 1.5 *. java 를 사용 하 십시오.
자바 파일 은 UTF - 8 형식 으로 저 장 됩 니 다.
servlet
response.reset();
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
업로드 용 new String (m binArray, m startData, (m endData - m startData) + 1, m Charset); 디 코딩 설정
tomcat 는 기본적으로 utf - 8 을 처리 하지 않 기 때문에 반드시
server. xml 의 연결 에 인 코딩 설정
port="80"protocol="HTTP/1.1"
connectionTimeout="30000"
redirectPort="8443" URIEncoding="UTF-8"/>
이렇게 하면 tomcat 은 resin 처럼 UTF - 8 을 사용 할 수 있 습 니 다.
URIEncoding = "UTF - 8" 설정 을 추가 하지 않 으 면 new String (request. getParameter ("cnParam"). getBytes ("ISO 8859 - 1"), "UTF - 8") 를 사용 해 야 합 니 다.
utf 8 인 코딩 으로 변환 합 니 다. post 라면 인 코딩 이 필요 없 지만 form post 폼 이 있 는 페이지 는 반드시 utf - 8 형식 이 어야 합 니 다.
RESIN 은 설정 하지 않 아 도 UTF - 8 을 받 아들 일 수 있 습 니 다.
UTF - 8 인 코딩 URL 이나 Get 중국어 값 사용 을 권장 합 니 다.
jsp 인 코딩 함수 클래스
java. net. URLDecoder. decode (String ChinatUTF - 8, String EncodeCharset); 디 코딩
java. net. URLEncoder. encode (String ChinaChar, String EncoderCharset); 인 코딩
JSP 의 중국어 난 장 판 에 대해 많이 말 했 지만 문 제 는 항상 밝 혀 져 야 합 니 다. 적어도 왜 그런 지 알 아야 합 니 다. 여 기 는 난 장 판 을 해결 하 는 좋 은 글 입 니 다. 글 마지막 에 제 개인 적 인 경험 을 첨부 해 야 합 니 다.
1. console 에서 직접 실행 되 는 클래스
이러한 상황 에 대해 저 희 는 프로그램 을 작성 할 때 사용자 로부터 중국 어 를 포함 할 수 있 는 입력 이나 중국 어 를 포함 할 수 있 는 출력 을 받 아야 한다 면 프로그램 에서 문자 흐름 으로 입력 과 출력 을 처리 해 야 합 니 다. 구체 적 으로 다음 과 같은 문자 형 노드 흐름 유형 을 사용 해 야 합 니 다.
파일: FileReader, FileWrieter
바이트 형 노드 흐름 유형: FileInputStream, FileOutputStream
메모리 (배열): CharArray Reader, CharArray Writer
바이트 형 노드 흐름 유형 은: ByteArray InputStream, ByteArray OutputStream
메모리 (문자열): StringReader, StringWriter
파이프: PipedReader, PipedWriter
그 바이트 형 노드 흐름 유형 은: PipedInputStream, PipedOutputStream
또한 입력 과 출력 을 다음 과 같은 문자 처리 흐름 으로 처리 해 야 합 니 다.
BufferedWriter,BufferedReader
바이트 처리 흐름: BufferedInputeStream, BufferedOutputStream
InputStreamReader,OutputStreamWriter
바이트 처리 흐름: DataInputStream, DataOutputStream
그 중에서 InputStreamReader 와 InputStreamWriter 는 바이트 흐름 을 지정 한 문자 인 코딩 집합 에 따라 문자 흐름 으로 변환 하 는 데 사 용 됩 니 다. 예 를 들 어:
InputStreamReader in = new InputStreamReader(System.in,"GB2312");
OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
예 를 들 어 다음 과 같은 예 를 들 어 JAVA 인 코딩 을 사용 하면 요구 에 도달 할 수 있 습 니 다.
//Read.java
import java.io.*;
public class Read {
public static void main(String[] args) throws IOException {
String str = "     ,         "+" test english character";
String strin= "";
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //           
BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //           
stdout.write("   :");
stdout.flush();
strin = stdin.readLine();
stdout.write("         :"+strin);
stdout.write(str);
stdout.flush();
}}

동시에 컴 파일 러 를 할 때 우 리 는 다음 과 같은 방식 으로 진행 합 니 다.
javac -encoding gb2312 Read.java
2, EJB 클래스 와 직접 실행 할 수 없 는 지원 클래스 (예: 자바 빈 클래스)
이러한 클래스 는 그 자체 가 다른 클래스 에 의 해 호출 되 고 사용자 와 직접 상호작용 을 하지 않 기 때문에 이러한 종류 에 있어 서 우리 가 제안 하 는 처리 방식 은 내부 프로그램 에서 문자 흐름 으로 프로그램 내부 의 중국어 문자열 (구체 적 으로 상기 절 과 같다) 을 처리 해 야 하 는 것 입 니 다. 또한 컴 파일 할 때 - encoding gb 2312 매개 변수 로 원본 파일 을 중국어 형식 으로 인 코딩 하면 됩 니 다.
3, Servlet 클래스 에 대한
Servlet 에 대해 다음 과 같은 방법 을 사용 하 는 것 을 권장 합 니 다.
Servlet 클래스 의 원본 프로그램 을 컴 파일 할 때 - encoding 으로 인 코딩 을 GBK 또는 GB 2312 로 지정 하고 사용자 에 게 출력 할 때 인 코딩 부분 은 response 대상 의 setContentType ("text / html; charset = GBK") 또는 gb 2312 로 출력 인 코딩 형식 을 설정 합 니 다. 마찬가지 로 사용자 가 들 어 올 때 request. setCharacterEncoding ("GB 2312") 을 사용 합 니 다.; 이렇게 하면 우리 의 servlet 류 가 어떤 운영 체제 에 이식 되 든 클 라 이언 트 의 브 라 우 저 만 중국어 디 스 플레이 를 지원 하면 정확하게 표시 할 수 있 습 니 다. 다음 과 같은 정확 한 예제 입 니 다.
//HelloWorld.java
package hello;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void init() throws ServletException { }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //        
response.setContentType("text/html;charset=GB2312"); //        
PrintWriter out = response.getWriter(); //    PrintWriter  
out.println("<hr>");
out.println("Hello World! This is created by Servlet!    !");
out.println("<hr>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //        
response.setContentType("text/html;charset=GB2312"); //        
String name = request.getParameter("name");
String id = request.getParameter("id");
if(name==null) name="";
if(id==null) id="";
PrintWriter out = response.getWriter(); //    PrintWriter  
out.println("<hr>");
out.println("         :" + name);
out.println("<hr>    id :" + id);
out.println("<hr>");
}
public void destroy() { }
}

이 프로그램 을 javac - encoding gb 2312 HelloWorld. java 로 컴 파일 하 십시오.
이 Servlet 를 테스트 하 는 프로그램 은 다음 과 같 습 니 다.
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<html><head><title></title>
<Script language="JavaScript">
function Submit() {
//  URL         Servlet
document.base.action = "./HelloWorld?name=  ";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input name="id" type="text" value="" size="30">
<a href = "JavaScript:Submit()">  Servlet</a>
</form></body></html>

4, JAVA 프로그램 과 데이터베이스 사이
JAVA 프로그램 과 데이터베이스 간 의 데이터 전달 에 어 지 러 운 현상 이 발생 하지 않도록 다음 과 같은 가장 좋 은 방법 으로 처리 하 는 것 을 권장 합 니 다.
1. JAVA 프로그램의 처리 방법 은 우리 가 지정 한 방법 으로 처리 합 니 다.
2. 데이터베이스 가 기본적으로 지원 하 는 인 코딩 형식 을 GBK 또는 GB 2312 로 변경 합 니 다.
예 를 들 어 my sql 에서 저 희 는 설정 파일 my. ini 에 다음 문 구 를 추가 하여 실현 할 수 있 습 니 다.
[my sqld] 영역 에서 증가:
default-character-set=gbk

그리고 증가:
[client]
default-character-set=gbk

SQL Server2K 에서 데이터베이스 의 기본 언어 를 Simplified Chinese 로 설정 하여 목적 을 달성 할 수 있 습 니 다.
5, JSP 코드 에 대한
JSP 가 실 행 될 때 WEB 용기 에서 동적 으로 컴 파일 되 기 때문에 JSP 원본 파일 의 인 코딩 형식 을 지정 하지 않 으 면 JSP 컴 파일 러 는 서버 운영 체제 의 file. encoding 값 을 얻어 JSP 파일 을 컴 파일 합 니 다. 이식 할 때 가장 문제 가 발생 하기 쉽 습 니 다. 예 를 들 어 중문 win2k 에서 잘 실 행 될 수 있 는 jsp 파일 을 영문 Liux 에 가 져 오 면 안 됩 니 다. 클 라 이언 트 가 똑 같 지만.용기 가 JSP 파일 을 컴 파일 할 때 가 져 오 는 운영 체제 의 인 코딩 이 다 르 기 때 문 입 니 다. (중국어 wink 의 file. encoding 과 영어 Linux 에서 file. encoding 은 다 르 고 영어 Linux 의 file. encoding 은 중국어 에 지원 되 지 않 기 때문에 컴 파일 된 JSP 류 는 질문 이 있 습 니 다). 인터넷 에서 토론 하 는 대부분 은 이런 문제 입 니 다. 주로 JSP 파일 이식 플랫폼 에서 정확하게 표시 되 지 않 는 문제 때 문 입 니 다. 이런 문제 에 대해 우 리 는 JAVA 에서 프로그램 인 코딩 전환 의 원 리 를 알 게 되 었 고 해결 하기 가 쉬 워 졌 습 니 다. 우리 가 제안 한 해결 방법 은 다음 과 같 습 니 다.
1. 저 희 는 JSP 가 클 라 이언 트 에 출력 할 때 중국어 인 코딩 방식 으로 출력 하 는 것 을 보증 해 야 합 니 다. 즉, 어쨌든 저 희 는 먼저 JSP 원본 편집 에 다음 줄 을 추가 해 야 합 니 다.
<%@page contentType="text/html; charset=gb2312"%>

2. JSP 가 들 어 오 는 인 자 를 정확하게 얻 을 수 있 도록 JSP 원본 파일 헤더 에 다음 문장 을 추가 합 니 다.
<%request.setCharacterEncoding("GB2312");%>
3. JSP 컴 파일 러 가 중국어 문 자 를 포함 한 JSP 파일 을 정확하게 디 코딩 할 수 있 도록 JSP 원본 파일 에 JSP 원본 파일 의 인 코딩 형식 을 지정 해 야 합 니 다. 구체 적 으로 말 하면 JSP 원본 파일 머리 에 다음 문장 을 추가 하면 됩 니 다.
<% @ page pageEncoding = "GB 2312"% > 또는 <% @ page Encoding = "GBK"% >
이것 은 JSP 규범 2.0 에 새로 추 가 된 명령 입 니 다.
이 방법 을 사용 하여 JSP 파일 의 중국어 문 제 를 풀 것 을 권장 합 니 다. 아래 코드 는 올 바른 JSP 파일 의 테스트 프로그램 입 니 다.
//testchinese.jsp
<%@page pageEncoding="GB2312"%>
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<%
String action = request.getParameter("ACTION");
String name = "";
String str = "";
if(action!=null & action.equals("SENT"))
{
name = request.getParameter("name");
str = request.getParameter("str");
}
%>
<html>
<head>
<title></title>
<Script language="JavaScript">
function Submit()
{
document.base.action = "?ACTION=SENT&str=     ";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input type="text" name="name" value="" size="30">
<a href = "JavaScript:Submit()">  </a>
</form>
<%
if(action!=null & action.equals("SENT"))
{
out.println("<br>       :"+name);
out.println("<br>   URL      :"+str);
}
%>
</body>
</html>

대부분의 로 컬 테스트 환경 이 TOMCAT 이기 때문에 중국어 문제 도 함께 첨부 합 니 다.
■ Tomcat 중국어 문제
tomcat 5 에서 이전에 tomcat 4 를 처리 하 는 방법 은 url 을 통 해 직접 제출 한 요청 을 처리 하 는 데 적용 되 지 않 는 다 는 것 을 발견 했다. 인터넷 에서 자 료 를 찾 는 것 은 마침내 가장 완벽 한 해결 방법 을 발견 했다. 모든 곳 이 바 뀌 었 고 get 과 post 가 정상 적 이 었 다.
질문 설명:
1. 폼 에 제출 한 데 이 터 는 request. getParameter ("xxx") 로 되 돌아 오 는 문자열 이 어 지 럽 거나?
2 url 을 통 해http://localhost/test.jsp?name=중국 에 서 는 이러한 get 요청 이 서버 에서 request 를 사용 합 니 다. getParameter ("name") 를 사용 할 때 되 돌아 오 는 것 은 어 지 러 운 코드 입 니 다. tomcat 4 의 방법 으로 Filter 를 설정 해도 소 용이 없 거나 request. setCharacterEncoding ("GBK") 을 사용 하지 않 습 니 다.
원인:
1 tomcat 의 j2ee 는 폼 제출 즉 post 방식 알림 을 실현 할 때 처리 매개 변 수 는 결 성 된 iso - 8859 - 1 로 처리 합 니 다.
2 tomcat 가 get 방식 으로 제출 한 요청 은 query - string 처리 시 post 방법 과 다른 처리 방식 을 사용 합 니 다. (tomcat 4 와 다 르 기 때문에 setCharacterEncoding ("gbk") 을 설정 하 는 것 은 효과 가 없습니다.
해결 방법:
우선 모든 jsp 파일 에 <% @ page pageEncoding = "GB 2312"% > <% @ page contentType = "text / html;charset=gb2312"%><%request.setCharacterEncoding("GB2312");%>
Filter. 처리 문자 집합 을 GBK 로 설정 합 니 다. (tomcat 의 webapps / servlet - examples 디 렉 터 리 에 완전한 예 가 있 습 니 다. 웹. xml 와 SetCharacterEncoding Filter 설정 을 참고 하 십시오.)
1)% TOMCAT 설치 디 렉 터 리% / webappservlets - examples WEB - INFclassfilers SetCharacterEncoding Filter. class 파일 을 웹 앱 디 렉 터 리 / filters 에 복사 하면 filers 디 렉 터 리 가 없 으 면 만 듭 니 다.
2) 웹. xml 에 다음 과 같은 몇 줄 을 추가 합 니 다: < filter >
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3) 완성.
2 get 방식 의 해결 방법
1) tomcat 의 server. xml 파일 을 열 고 블록 을 찾 아 다음 줄 을 추가 합 니 다.
URIEncoding="GBK"
사실 여기 가 바로 Tomcat 중국어 코드 의 관건 입 니 다. 온전한 것 은 다음 과 같 습 니 다.
<Connector 
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" 
disableUploadTimeout="true" 
URIEncoding="GBK"
/>

2) tomcat 를 다시 시작 합 니 다. 모든 것 이 좋 습 니 다.
다음 jsp 페이지 를 실행 하여 성공 여 부 를 테스트 합 니 다.
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<%
String q=request.getParameter("q"); 
q = q == null? "   " : q;
%>
<HTML>
<HEAD><TITLE>      </TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=pragma content=no-cache>
<body>
    :
<%=q%>
<br>
<form action="tcnchar.jsp" method="post">
    :<input type="text" name="q"><input type="submit" value="  ">
<br>
<a href="tcnchar.jsp?q=  ">  get    </a>
</form>
</BODY></HTML>

다른 인 코딩 은 유사 하 므 로 국제 인 코딩 규범 의 UTF 8 인 코딩 을 사용 하 는 것 을 권장 합 니 다.

좋은 웹페이지 즐겨찾기