1: 양식은 포스트 모드에서 포그라운드로 데이터를 제출합니다.
브라우저가 데이터("중국"으로 가정)를 서버로 보낼 때 해당 데이터를 0101(98 99로 가정)의 이진 데이터로 변환할 때 브라우저가 해당 코드 테이블을 열어야 합니다. 웹 페이지에서 브라우저는 데이터를 제출할 코드 테이블을 결정합니다. 데이터가 서버에 도달한 후 데이터(98 99)를 요청에 캡슐화해야 합니다. 서블릿에서 요청의 getParameter 메서드를 호출하면 메서드 내에서 숫자를 가져온 후 문자열("China")을 반환해야 합니다. 코드를 꼭 확인하세요. 요청의 디자이너가 외국인이기 때문에 기본 쿼리는 그들이 일반적으로 사용하는 ISO8859-1입니다. 이것이 왜곡된 요청 데이터의 소스입니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.yyz.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//게시 모드에서 양식 제출
공개 클래스 RequestDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
//요청 데이터의 중국어 왜곡 문제
request.setCharacterEncoding("UTF-8");//클라이언트 웹페이지를 UTF-8로 제어합니다.
String 사용자 이름 = request.getParameter("사용자 이름");
//데이터 가져오는 것은 정상입니다. 데이터 출력 시 다른 코드 테이블을 확인할 수 있습니다.
response.setCharacterEncoding("gb2312");//데이터 전송 시 참고할 코드 테이블을 서버에 알립니다.
response.setContentType("text/html;charset=gb2312");//어떤 코드 테이블을 열 것인지 브라우저에 알립니다.
PrintWriter 출력 = response.getWriter();
out.write(사용자 이름);
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
2: 양식은 가져오기 모드에서 포그라운드로 데이터를 제출합니다.
get 메소드에 제출된 데이터는 여전히 브라우저에서 이를 열기 위해 사용하는 코드 테이블을 사용하여 전송됩니다. 차이점은 가져오기 모드에서 데이터를 제출할 때 요청 설정 인코딩이 유효하지 않다는 것입니다. UTF-8이 설정되어 있어도 ISO8859-1은 계속 확인됩니다. 이 문제를 해결하려면 (??)를 사용하여 ISO8859-1을 역으로 확인해야 합니다. (98 99)를 얻은 후 올바른 코드 테이블을 확인하십시오.
다음과 같이 코드 코드를 복사합니다.
패키지 com.yyz.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//get 메소드를 통해 양식 제출
공개 클래스 RequestDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
//요청 데이터의 중국어 왜곡 문제
request.setCharacterEncoding("UTF-8");//가져오기 모드에서 데이터를 제출할 때 요청 설정 인코딩이 유효하지 않습니다. UTF-8이 설정되어 있어도 ISO8859-1은 계속 확인됩니다.
String 사용자 이름 = request.getParameter("사용자 이름");
System.out.println(사용자 이름);
바이트 소스 [] = username.getBytes("iso8859-1");
사용자 이름 = 새 문자열(소스,"UTF-8");
System.out.println(사용자 이름);
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
세 번째: 제출된 데이터의 중국어 왜곡 문제 요약:
1. 제출 방법이 게시인 경우 문자 깨짐을 방지하려면 요청 개체의 인코딩만 설정하면 됩니다.
참고: 클라이언트 데이터가 제출되는 방식은 요청을 어떤 인코딩으로 설정해야 하는지에 따라 달라집니다.
2. 제출 방법이 get인 경우 요청 개체의 인코딩 설정이 유효하지 않습니다. 문자 깨짐을 방지하려면 수동으로만 변환할 수 있습니다.
문자열 데이터 = "????????";//잘못된 문자열
byte source [] = data.getBytes("iso8859-1");//클라이언트가 제출한 원본 데이터 가져오기
data = new String (data.getBytes("iso8859-1"),"UTF-8");//깨진 문자 해결
//같음
data = 새 문자열(소스,"UTF-8");
3. get 메소드의 잘못된 코드는 서버 구성을 변경하여 얻을 수도 있습니다. Tomact의 conf 디렉토리에서 server.xml 파일을 변경하십시오.
3.1
이 접근 방식은 서버를 변경하고 유연하지 않으므로 권장되지 않습니다.
3.2
이 설정 후에는 요청의 setCharacterEncoding에 의해 설정된 인코딩이 커넥터에서 사용됩니다. 이전 변경보다 유연하기는 하지만 여전히 애플리케이션이 서버에 단단히 종속되므로 권장되지 않습니다.
4: 마지막으로 작은 세부 사항을 언급하겠습니다. URL 주소 뒤에 중국어 데이터가 오면 URL로 인코딩되어야 합니다. 양식에 제출된 매개변수에는 중국어 데이터가 포함되어 있어 브라우저가 자동으로 인코딩을 도와주지만 링크를 통해 직접 중국어 매개변수를 가져오면 브라우저가 이를 해결하는 데 도움을 주지 않습니다. 위의 두 번째 방법을 통해 중국어 글자가 깨져 나오는 문제를 해결해야 합니다. 먼저 URLEncoding.encode(,"UTF-8")를 통해 인코딩해야 합니다.