java 웹 - 웹의 인코딩 문제 집합

5374 단어
노트 요약:
본고는 최근 웹 학습에서 겪은 중국어 부호화 문제를 정리했다. 사실 문제의 관건은 바로 파일을 저장할 때의 인코딩과 서비스 측이 제출한 데이터에 대한 인코딩, 브라우저의 인코딩이다. 이 세 가지 인코딩 문제를 분명히 하기만 하면 중국어 부호화 문제를 철저히 해결할 수 있다. 물론 앞으로 다른 유형의 부호화 문제를 만날 수도 있다.아무리 변해도 근본을 떠나지 않는다고 믿다.
1. HttpServletResponse가 클라이언트에게 중국어 데이터를 출력하는 난자 문제
response는 클라이언트에게 데이터를 출력하는 두 가지 방식이 있습니다: get OutputStream과 getWriter
방법 1: getOutputStream 사용()
랩: getOutputStream().write("중국".getBytes("utf-8");난자 가 생기다
원인: getBytes () 는 기본적으로 GB2312입니다. 여기는utf-8을 지정하고 브라우저는 기본 GB2312로 열려 있기 때문에 부호화 문제가 발생합니다.
해결 방법:
브라우저가 어떤 부호표로 디코딩되는지 지정해야 합니다
1. response.setHeader("content-type", "text/html;charset=utf-8");//요청 메시지 헤더를utf-8로 설정하고 브라우저를utf-인코딩으로 엽니다
2.응답 헤드 정보 시뮬레이션
방식2: getWriter(), 문자 출력 흐름 가져오기
실험:response.getWriter().write("중국");난자 가 생기다
이유:
여기서 얻은 것은 문자 흐름이기 때문에 서버가 브라우저에 되돌아갈 때 바이트 데이터로 변환되어 인코딩을 해야 한다. 이때 찾은 것은 ISO8859-1 코드, ISO8859-1 코드이다.
중국어가 없어서 "??"를 찾았어요.서버는 GB2312로 열리고 GB2312는 ISO8859-1과 호환되기 때문에 브라우저는 바로 "??"
 
솔루션:
방식 1
response.setHeader("Content-type", "text/html;charset=utf-8");//요청 메시지 헤더를utf-8로 설정하여 브라우저가utf-인코딩으로 열 수 있도록 합니다
response.setCharacterEncoding("utf-8");//서버 분석 시 인코딩 형식을utf-8로 설정합니다
시나리오 2
response.setContentType("text/html;charset=utf-8");위의 두 문장과 같다
권장 사항:
response를 사용하고 있습니다.setContentType("text/html;charset=utf-8");덧붙이다
 response.setCharacterEncoding("utf-8");이렇게 하면 더욱 읽기 쉽다
2. HttpServletRequest 요청 난자
요청을 제출하는 방법
하이퍼링크, 폼, 서비스 표시줄에서 직접 요청
POST 양식
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
		<head>
			<title>3.html</title>
		</head>
		<body>
			<a href="/day05/servlet/ConfusingCodeDemo?user=zhangsan&psw=12345">         </a>
			<hr>

GET 양식
			<form action="/day05/servlet/ConfusingCodeDemo">
				   <input type="text" name="user">
				  <input type="password" name="psw">
				<input type="submit" value="  ">
			</form>
			POST
			<hr>
			<form action="/day05/servlet/ConfusingCodeDemo" method="POST">
				   <input type="text" name="user">
				  <input type="password" name="psw">
				<input type="submit" value="  ">
			</form>
		</body>
	</html>
	

문제 원인:
데이터를 제출할 때 중국어(일반적으로 GBK로 기본값)일 경우 서버에 제출할 때 리퀘스트 처리를 할 때 ISO8859-1 인코딩을 하고 ISO8859-1 인코딩은 GBK를 지원하지 않기 때문에 일부 난코드로 해석하여 브라우저에 되돌려줍니다
POST 방식 제출 해결 방법
request.setCharacterEncoding("GB2312");//Request에 넣습니다.getParameter() 앞에 있어야 유효합니다.
하지만 이런 방식은 POST 제출에만 유용합니다.
GET 방식 제출 해결 방법(POST 방식에서도 공통)
먼저 ISO8859-1 인코딩을 해서 서버에서 식별할 수 있도록 한 다음에 ISO8859-1 인코딩된 바이트로 GB2312 인코딩을 해서 중국어를 표시합니다
String user = request.getParameter("user");
user = new String(user.getBytes("ISO8859-1"),"GB2312");//먼저 ISO8859-1 인코딩을 진행하여 서버 측이 식별할 수 있도록 한 다음에 GBK 인코딩을 사용하여 브라우저에 제출한다
POST 및 GET 모두 해결 가능(권장하지 않음)
tomcat의 구성 파일을 수정하려면 다음과 같이 하십시오.http://localhost:8080/docs/config/http.html
URIEncoding 지정 서비스 측 인코딩
useBodyEncodingForURI:true로 설정하면 POST의 제출 방식:request.setCharacterEncoding("GB2312");GET 방식에도 유용합니다.
3. 파일 다운로드를 실현할 때의 중국어 문제
response를 이용하여 HTTP의 응답 헤더'content-disposition'을'attachment;filename=xxx'로 설정하면 파일 다운로드 기능을 실현할 수 있습니다
참고:
만약 파일 이름에 중국어가 포함된다면, 파일 이름은 URL 인코딩을 해야 합니다: URLEncoding.encode('카라.jpg','utf-8');인코딩을 하지 않으면 파일 이름이 오류를 표시하고 다운로드할 수 없습니다.
private void  download(){
String urlName = URLEncoder.encode("  .jpg","utf-8");//               ,    URL  ,        
        response.setHeader("content-disposition","attachment;filename="+urlName);  
//      response.setHeader("content-disposition","attachment;filename=Koala.jpg");//              ,        
        InputStream in = this.getServletContext().getResourceAsStream("/Koala.jpg");//             
        OutputStream out = response.getOutputStream();  
          
        //      
        int len = 0;  
        byte[] buf = new byte[1024];  
        while((len=in.read(buf))!=-1){  
            out.write(buf,0,len);  
        }  
        in.close();  
}

4. JSP의 부호화 문제
페이지 명령을 사용하여 JSP 중국어 난자 해결
1. JSP 프로그램에 서브렛 프로그램과 동일한 중국어 난자 문제가 있음
a) 출력이 본문에 응답할 때 발생하는 중국어 난자 문제
b) 브라우저가 전달하는 매개 변수 정보를 읽을 때 발생하는 중국어 난자 문제
2. JSP 엔진이 JSP 페이지를 서브렛 소스 파일로 번역할 때도 중국어 난자 문제를 초래할 수 있다(파일 인코딩과 해석할 때의 인코딩이 다르다)
a) JSP 엔진은 JSP 소스 파일을 서브렛 소스 파일로 번역할 때 기본적으로 UTF-8 인코딩을 사용하고, JSP 개발자는 다양한 문자 집합 인코딩으로 JSP 소스 파일을 작성할 수 있으므로 JSP 엔진은 JSP 소스 파일을 번역합니다.
서브렛 소스 파일이 될 때는 문자 인코딩 변환이 필요합니다. 
b) JSP 파일에 문자 세트 인코딩이 설명되어 있지 않으면 JSP 엔진은 기본 ISO8859-1 문자 세트 인코딩으로 처리합니다.
3 JSP 엔진이 JSP 페이지를 번역할 때의 중국어 난자 문제를 어떻게 해결합니까
페이지 명령의 contentType 속성을 통해 JSP 소스 파일의 문자 세트 인코딩 설명
페이지 명령의 페이지 엔코딩 속성 설명 JSP 소스 파일을 servlet으로 번역할 때의 문자 집합 인코딩
사실 페이지 Encoding만 설정하면 됩니다. 이 속성이 설정되면 번역 엔진이 간접적으로 콘텐츠-type 속성을 설정합니다.

좋은 웹페이지 즐겨찾기