JSP 왜곡 문제에 대한 해결책
2009-07-15 10:32
1. JSP 페이지가 왜곡되는 이유는 페이지에 문자 집합 인코딩이 지정되지 않았기 때문입니다. 해결 방법: 페이지 시작 부분에 다음 코드를 사용하여 문자 집합 인코딩을 지정하면 됩니다. <%@ page contentType= "텍스트 /html; charset=gb2312" %>
2. 데이터베이스 문자 깨짐 이러한 종류의 문자 깨짐으로 인해 데이터베이스에 삽입한 한자가 깨져서 읽히거나 표시될 때 데이터베이스에 삽입된 한자가 깨져서 표시됩니다. :
데이터베이스 연결 문자열에 인코딩된 문자 집합을 추가합니다(데이터 소스 연결에도 동일하게 적용됨).
문자열 Url="jdbc:mysql://localhost/digitgulf?
사용자=루트&비밀번호=루트&useUnicode=true&characterEncoding=GB2312";
그리고 페이지에서 다음 코드를 사용하십시오.
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. 한자를 매개변수로 전달할 때 문자가 깨집니다. 한자를 다른 페이지에 매개변수로 전달할 때 문자가 깨져 나옵니다. 해결 방법은 다음과 같습니다.
RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)와 같은 매개변수를 전달할 때 매개변수를 인코딩합니다.
그런 다음 수신 매개변수 페이지에서 다음 명령문을 사용하여 키워드=new String(request.getParameter("keywords").getBytes("8859_1"));를 수신합니다.
잘못된 문자의 핵심 문제는 여전히 문자 집합 인코딩 문제입니다. 이 문제를 숙지하면 일반적인 잘못된 코드 문제를 해결할 수 있습니다.
-----------------------------
Java와 JSP를 접한 이후로 Java의 중국어 문자 왜곡 문제를 지속적으로 다루어 왔습니다. 이제 마침내 완전히 해결되었습니다.
1. 자바 중국어 문제의 근원
Java의 코어 및 클래스 파일은 유니코드를 기반으로 하므로 Java 프로그램이 크로스 플랫폼에 적합하지만 중국어 문자가 깨져서 문제가 발생하기도 합니다. 두 가지 주된 이유가 있습니다. 하나는 Java 및 JSP 파일 자체의 컴파일로 인해 발생하는 잘못된 코드 문제이고 다른 하나는 Java 프로그램과 다른 미디어의 상호 작용으로 인해 발생하는 잘못된 코드 문제입니다.
우선, Java(JSP 포함) 소스 파일에는 중국어가 포함될 가능성이 높으며, Java 및 JSP 소스 파일의 저장 방법은 바이트 스트림을 기반으로 합니다. Java 및 JSP를 클래스 파일로 컴파일하는 경우 사용되는 인코딩 방법이 다릅니다. 인코딩이 일관되지 않으면 잘못된 문자가 나타납니다. 이런 왜곡된 코드를 기반으로 자바 파일에는 중국어를 쓰지 않는 것이 좋습니다(주석 부분은 컴파일에 참여하지 않으므로 중국어를 작성해도 상관없습니다). - GBK 인코딩 또는 JSP용 gb2312 인코딩, 파일 헤더에 <%@ page contentType="text/html;charset=GBK"%> 또는 <%@ page contentType="text/html;charset=gb2312"% 추가 > 이런 종류의 잘못된 코드 문제를 기본적으로 해결할 수 있습니다.
이 기사에서는 Java 프로그램이 다른 저장 매체와 상호 작용할 때 생성되는 잘못된 코드인 두 번째 유형의 잘못된 코드에 중점을 둘 것입니다. 데이터베이스, 파일, 스트림 등과 같은 많은 저장 미디어는 바이트 스트림을 기반으로 합니다. Java 프로그램이 이러한 미디어와 상호 작용할 때 예를 들어 페이지에서 문자(char)와 바이트(byte) 간의 변환이 발생합니다. 제출 양식에 제출된 데이터는 Java 프로그램에서 잘못된 문자를 표시합니다.
위 변환 프로세스에 사용된 인코딩 방법이 바이트의 원래 인코딩과 일치하지 않으면 잘못된 문자가 나타날 수 있습니다.
2. 솔루션
인기 있는 Tomcat의 경우 두 가지 솔루션이 있습니다.
1) D:Tomcatconfserver.xml을 변경하고 브라우저 인코딩 형식을 "중국어 간체"로 지정합니다.
방법은 찾는 것이다.
<커넥터 포트="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
활성화Lookups="false" RedirectPort="8443" acceptCount="100"
ConnectionTimeout="20000" 비활성화UploadTimeout="true" URIEncoding='GBK' />
내가 추가한 태그, 굵은 텍스트.
다음과 같이 변경이 성공했는지 확인할 수 있습니다. 변경하기 전에 잘못된 페이지가 나타나는 IE 브라우저에서 "보기 | 인코딩" 메뉴를 클릭하면 "서유럽(ISO)"이 선택되어 있는 것을 확인할 수 있습니다. 변경 후 "보기 | 인코딩" 메뉴를 클릭하면 "중국어 간체(GB2312)"가 선택되어 있는 것을 확인할 수 있습니다.
b) 내 프로그램을 다음과 같이 업데이트합니다.
공개 클래스 ThreeParams는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
response.setContentType("text/html; charset=GBK");
...
}
}
굵은 글꼴이 필요하며 그 기능은 브라우저가 유니코드 문자를 GBK 문자로 변환할 수 있도록 하는 것입니다. 이렇게 하면 페이지의 내용과 브라우저의 표시 모드가 GBK로 설정되므로 문자가 깨지는 일이 없습니다.
Tomcat에서 중국어에 대한 완벽한 솔루션
요즘 서버는 톰캣, 운영체제는 기사와 의견으로 프로젝트를 개발하고 있는데 드디어 완성됐습니다. 하지만 좋은 기억력은 나쁜 펜만큼 좋지 않기 때문에 잊어버리지 않도록 하고, 같은 문제를 겪는 분들에게 좋은 참고가 되고자 적어보았습니다.
(1) JSP 페이지는 중국어로 되어 있는데, 보면 깨져있습니다.
해결 방법은 JSP 페이지의 인코딩에 <%@ page Language="java" contentType="text/html;charset=GBK" %>를 사용하는 것입니다. Jsp를 Java 파일로 변환할 때 인코딩 문제가 있기 때문입니다. 기본 일부 서버는 ISO-8859-1입니다. JSP에 중국어를 직접 입력하면 Jsp에서 이를 ISO8859-1로 처리하는 데 문제가 있을 것입니다. Jasper에서 생성된 Java 중간 파일을 보면 이를 확인할 수 있습니다.
(2) 고객이 제출한 한자 코드를 얻기 위해 요청 개체를 사용할 때 왜곡된 문자가 나타납니다.
해결책은 Servlet 필터인 필터를 구성하는 것입니다. 코드는 다음과 같습니다.
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;
공개 클래스 CharacterEncodingFilter는 필터를 구현합니다.
개인 FilterConfig 구성;
개인 문자열 인코딩 = "ISO8859_1";
공공 무효 파괴() {
System.out.println(config);
구성 = null;
}
public void doFilter(ServletRequest 요청, ServletResponse 응답,
FilterChain 체인)은 IOException, ServletException을 발생시킵니다.
request.setCharacterEncoding(인코딩);
//chain.doFilter(요청, 응답);
chain.doFilter(요청, 응답);
}
public void init(FilterConfig config)에서 ServletException이 발생합니다.
this.config = 구성;
String s = config.getInitParameter("인코딩");
if (s != null) {
인코딩 = s;
}
}
}
}
web.xml 구성
<필터>
<필터 매핑>
필터 매핑>
이러한 상황이 계속 발생하는 경우 아래로 내려가서 네 번째 상황이 있는지 확인할 수 있습니다. 양식에서 제출한 데이터가 get을 사용하여 제출되었는지 여부 일반적으로 그렇다면 게시물을 사용하여 제출하면 문제가 없습니다. , 네 번째 해결 방법을 살펴보세요.
한자가 포함된 정보에 대한 처리도 있습니다. 처리 코드는 다음과 같습니다.
packagedbJavaBean;
공개 클래스 CodingConvert
{
공개 코딩변환()
{
//
}
공개 문자열 toGb(문자열 uniStr){
문자열 gbStr = "";
if(uniStr == null){
uniStr = "";
}
노력하다{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte,"GB2312");
}
catch(예외예외){
}
gbStr을 반환;
}
공개 문자열 toUni(문자열 gbStr){
문자열 uniStr = "";
if(gbStr == null){
gbStr = "";
}
노력하다{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = new String(tempByte,"ISO8859_1");
}catch(예외예외){
}
uniStr을 반환합니다.
}
}
직접 변환을 수행할 수도 있습니다. 먼저 ISO-8859-1로 얻은 문자열을 인코딩한 다음 인코딩을 바이트 배열에 저장하고 배열을 문자열 개체로 변환합니다.
String str=request.getParameter("소녀");
바이트 B[]=str.getBytes("ISO-8859-1");
Str=새 문자열(B);
위의 변환을 통해 제출된 모든 정보가 올바르게 표시될 수 있습니다.
(3) Formget 요청이 서버에서 request.getParameter("name")을 사용하는 경우 Tomcat의 방법에 따라 필터를 설정하면 작동하지 않거나 request.setCharacterEncoding("GBK")을 사용할 수 없습니다. 문제는 매개변수 전송을 처리하는 방법에 있어서: 이전에 작성했더라도 서블릿에서 doGet(HttpServletRequest 요청, HttpServletResponse 응답) 메서드를 사용하여 처리하는 경우입니다.
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
그것도 작동하지 않습니다. 반환된 중국인은 여전히 왜곡되어 있습니다! ! ! 이 함수를 doPost(HttpServletRequest request, HttpServletResponse response)로 변경하면 모든 것이 정상입니다.
마찬가지로 두 개의 JSP 페이지를 사용하여 폼 입력을 처리할 때 중국어가 표시될 수 있는 이유는 이를 전달하기 위해 post 메소드를 사용하는데, 여전히 get 메소드로 변경해도 작동하지 않기 때문입니다.
서블릿에서 doGet() 메소드를 사용하거나 JSP에서 get 메소드를 사용할 때 주의가 필요함을 알 수 있다. 결국 여기에는 브라우저를 통해 매개변수 정보를 전달하는 작업이 포함되며, 이로 인해 일반적으로 사용되는 문자 집합에서 충돌이나 불일치가 발생할 가능성이 높습니다.
해결책은 다음과 같습니다.
1) tomcat의 server.xml 파일을 열고 블록을 찾아 다음 줄을 추가합니다.
URIEncoding=”GBK”
전체 내용은 다음과 같아야 합니다.
2) Tomcat을 다시 시작하면 모든 것이 정상입니다.
$TOMCAT_HOME/webapps/tomcat-docs/config/http.html 아래의 파일을 검토하여 가입해야 하는 이유를 확인할 수 있습니다. 여기서 UTF-8을 사용하면 전송 프로세스 중에 잘못된 문자가 Tomcat에 표시됩니다. 그래도 작동하지 않으면 다른 문자 세트로 변경하세요.
(4) JSP 페이지에는 한자가 있고 버튼에는 한자가 있는데, 서버를 통해 페이지를 볼 때 깨져 보이는 문자가 나타납니다.
해결책은 다음과 같습니다. 첫째, 현지화된 메시지 텍스트를 JSP 파일에 직접 포함해서는 안 되지만 텍스트는
(5) 데이터베이스에 작성된 코드가 깨졌습니다.
해결책: Servlet 필터인 필터를 구성하십시오. 코드는 두 번째와 동일합니다.
JDBC를 통해 데이터베이스에 직접 연결하는 경우 구성 코드는 다음과 같습니다. jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK 이렇게 하면 데이터베이스의 코드가 왜곡되지 않습니다.
데이터 소스를 통해 연결하면 위의 내용도 적합합니다. 올바르게 구성하면 중국어를 입력하면 데이터베이스에서도 중국어로 표시됩니다. 데이터를 표시하는 페이지입니다. Language="java" contentType="text/html;charset=GBK" %>이 코드 줄입니다. 주의할 점은 일부 프런트 직원이 Dreamver를 사용하여 코드를 작성하는데, Form을 작성할 때 주의할 점이 하나 있는데 바로 Dreamver에서 Action을 제출하는 방법이다. JSP 제출에는 POST와 GET이라는 두 가지 방법이 있기 때문에 이를 보내야 합니다. 그러나 이 두 가지 방법으로 제출된 코드는 인코딩 측면에서 여전히 매우 다릅니다.
기사 요약:
여기서는 주로 jsp 왜곡 문제에 대한 해결책에 대해 이야기합니다.
1. 문자 왜곡의 가장 기본적인 문제.
PHPCE.CN, 디자인 매뉴얼
3. 양식 가져오기 제출 방법에서 문자가 깨졌을 때 처리하는 방법.
중국어를 제출하기 위해 get 메소드를 사용하는 경우 매개변수를 허용하는 페이지도 깨져서 표시됩니다. 이 잘못된 코드의 원인은 tomcat의 내부 인코딩 형식 iso8859-1 때문이기도 합니다. Tomcat은 기본 인코딩 방법인 get, iso8859-1을 사용하여 중국어 문자를 인코딩하고 인코딩 후 URL에 이를 추가하므로 매개변수가 왜곡되어 / 페이지에서 수신됩니다.
해결책:
A. 위 예의 첫 번째 방법을 사용하여 수신된 문자를 디코딩한 다음 트랜스코딩합니다.
B. Get은 URL 제출을 사용하며, URL을 입력하기 전에 iso8859-1 인코딩이 수행되었습니다. 이 인코딩에 영향을 미치려면 server.xml의 커넥터 노드에 useBodyEncodingForURI="true"를 추가해야 합니다.
속성 구성은 get 메소드에 대한 tomcat의 중국어 문자 인코딩 방법을 제어할 수 있습니다. 위 속성은 request.setCharacterEncoding("UTF-8")에 의해 설정된 인코딩 형식을 사용하여 인코딩되도록 get 제출을 제어합니다. 따라서 자동으로 utf-8로 인코딩되어 승인페이지에서는 정상적으로 승인이 가능합니다. 하지만 실제 인코딩 프로세스는 Tomcat이 D:Tomcatconfserver.xml을 변경하고 브라우저의 인코딩 형식을 "중국어 간체"로 지정해야 한다는 것입니다.
<커넥터 포트="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
활성화Lookups="false" RedirectPort="8443" acceptCount="100"
debug="0" ConnectionTimeout="20000" useBodyEncodingForURI="true"
비활성화UploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CN, 디자인 매뉴얼에서 설정한 URIEncoding="UTF-8"이 다시 인코딩되는데 utf-8로 인코딩되었기 때문에 인코딩이 되지 않습니다. 다시 인코딩되었습니다. 뭔가 변경되었습니다. URL에서 인코딩을 얻은 경우 수신 페이지는 URIEncoding="UTF-8"에 따라 디코딩됩니다.
$TOMCAT_HOME/webapps/tomcat-docs/config/http.html 아래의 파일을 검토하면 추가해야 하는 이유를 알 수 있습니다. 다음과 같이 변경이 성공했는지 확인할 수 있습니다. 변경하기 전에 잘못된 페이지가 나타납니다. IE 브라우저에서 "보기 | 인코딩" 메뉴를 클릭하면 "서유럽(ISO)"이 선택되어 있는 것을 확인할 수 있습니다. 변경 후 "보기 | 인코딩" 메뉴를 클릭하면 "중국어 간체(GB2312)"가 선택되어 있는 것을 확인할 수 있습니다.
4. 파일 업로드 시, 양식 설정이 enctype="multipart/form-data"로 되어 있어 문자가 깨져 있는 문제를 해결합니다. 이렇게 하면 파일이 스트리밍 방식으로 제출됩니다. Apache의 업로드 구성 요소를 사용하면 잘못된 코드가 많이 발견됩니다. 이는 apach의 초기 commons-fileupload.jar에 버그가 있어서 한자를 빼서 디코딩하기 때문입니다. 이 메소드를 제출하기 때문에 인코딩은 자동으로 tomcat의 기본 인코딩 형식인 iso-8859-1을 사용합니다. 하지만 문자 깨짐의 문제는 마침표, 쉼표 등의 특수 기호가 문자가 깨져서 나타나는 한자 개수가 홀수이면 문자가 깨져서 나타나는 것입니다. .
해결 방법: commons-fileupload-1.1.1.jar을 다운로드하세요. 이 버전의 jar는 이러한 버그를 해결했습니다.
그러나 콘텐츠를 추출할 때 추출된 문자를 iso8859-1에서 utf-8로 트랜스코딩해야 합니다. 모든 일반 한자와 문자를 얻을 수 있습니다.
5. URL 요청과 관련된 Java 코드, 잘못된 매개변수 수신
URL의 인코딩 형식은 위에서 언급한 URIEncoding="UTF-8"에 따라 다릅니다. 이 인코딩 형식이 설정되면 URL에 대한 모든 중국어 문자 매개변수를 인코딩해야 함을 의미합니다. 그렇지 않으면 획득한 한자 매개변수 값이 모두 왜곡되어 Response.sendDelect ("/a.jsp?name=Zhang Dawei") 링크와 같이 a.jsp에서 직접 사용됩니다.
PHPCE.CN, 디자인 매뉴얼
String name = request.getParameter("name"); 문자가 왜곡되어 표시됩니다. utf-8이어야 한다고 규정되어 있으므로 리디렉션은 다음과 같이 작성되어야 합니다.
Response.sendDelect("/a.jsp?name=URLEncode.encode("Zhang Dawei","utf-8"); 전용.
이 매개변수 URIEncoding="UTF-8"이 설정되지 않으면 어떻게 되나요? 설정하지 않으면 기본 인코딩 형식 iso8859-1이 사용됩니다. 또 문제가 발생하는데, 첫 번째는 매개변수 값의 개수가 홀수이면 정상적으로 파싱이 가능하다는 점이다. 짝수이면 마지막 문자가 깨진다. 또한 마지막 문자가 영어인 경우 정상적으로 구문 분석할 수 있지만 중국어 구두점은 여전히 깨져 있습니다. 편의상 매개변수에 중국어 문장부호가 없는 경우 매개변수 값 끝에 영문 기호를 추가하여 왜곡된 문제를 해결한 후 매개변수를 가져온 후 마지막 기호를 제거할 수 있습니다. 긁어내거나 사용할 수도 있습니다.
6. URL 요청과 관련하여 스크립트 코드는 수신된 매개변수가 왜곡된 경우 페이지 리디렉션도 제어합니다. 또한 첨부된 매개변수를 포함하고 수신 페이지의 매개변수를 구문 분석합니다. 이 한자 매개변수가 URIEncoding="UTF-8"에 지정된 인코딩 처리를 수행하지 않으면 수신 페이지에서 수신한 한자도 왜곡됩니다. 스크립트 처리 및 인코딩이 번거롭습니다. 인코딩 스크립트에 해당하는 파일이 있어야 하며, 그런 다음 스크립트에서 메소드를 호출하여 한자를 인코딩해야 합니다.
7. MyEclipse에서 열리는 jsp의 왜곡 문제와 관련하여 기존 프로젝트의 경우 Jsp 파일의 저장 형식이 utf-8일 수 있습니다. Eclipse를 새로 설치한 경우 기본적으로 열 때 사용되는 인코딩 형식은 iso8859-1입니다. 따라서 jsp의 한자가 깨져 있습니다. 이 잘못된 코드는 상대적으로 해결하기 쉽습니다. eclipse3.1의 환경 설정으로 이동하여 일반->편집기를 찾고 파일의 시작 인코딩을 utf-8로 설정하세요. Eclipse는 새로운 인코딩 형식으로 자동으로 다시 열립니다. 한자는 정상적으로 표시될 수 있습니다.
8. Eclipse에서 HTML 페이지를 열 때 코드가 깨지는 현상에 대해. 대부분의 페이지는 Dreamweaver에서 생성되므로 저장 형식이 Eclipse에서 인식하는 방식과 다릅니다.
일반적으로 이 경우 eclipse에서 새 jsp를 만들고 dreamweaver에서 직접 페이지 내용을 복사하여 jsp에 붙여넣습니다.
PHPCE.CN, 디자인 매뉴얼
이 잘못된 코드 문제는 가장 간단한 잘못된 코드 문제입니다. 일반적으로 새로운 것이 나타납니다. 일관성 없는 페이지 인코딩으로 인해 발생하는 잘못된 코드입니다.
<%@ 페이지 언어="java" pageEncoding="UTF-8"%>
<%@ 페이지 contentType="text/html;charset=iso8859-1"%>
<머리>