포맷 인코딩 jsp 인코딩 분석 및 해결 (1)

11971 단어 jsp
이 글은 친구가 청도에서 밥을 먹을 때 갑자기 생각난...그 동안 포맷 코드에 관한 몇 편의 글을 쓰고 싶었기 때문에 집에 돌아간 후 붓을 휘둘러 써서 발표하였다
틀림없이 여러분들은 사이트를 개설할 때 자주 난자 문제에 부딪혔을 것입니다. 최근에 자신이 블로그의 작은 예를 썼을 때 또 난자 문제에 부딪혔을 것입니다. 일반적으로 모두 보기 드문 것입니다. 흔히 검색하고 처리 방안이 있지만 인터넷에는 대부분 처리 방안을 직접 붙이고 구체적인 원인을 지적하지 않았습니다.그래서 요 며칠 동안 저는 코드에 관한 글을 읽고 서서히 실마리가 잡혔습니다. 그래서 편하게 썼습니다. 저는 자신이 겪은 코드 문제를 하나하나 여러분께 보여드리고 원인을 분석하고 처리 방법을 쓰겠습니다.
    
만약 잘못이 있으면 여러분들이 많이 포괄하여 적극적으로 교정해 주십시오!한 사람의 이해는 왕왕 무한하고 심지어 잘못이 있기 때문에 군책군력이 분석을 더욱 정확하고 완벽하게 할 수 있다!
    
    
먼저 코드를 보고 몇 가지 코드를 설명한다.
<%@ page language="java" pageEncoding="gb2312"%>

<%@ page contentType="text/html;charset=iso8859-1"%>

<html>

<head>

<title>JSP     </title>

<meta http-equiv="Content-Type" content="text/html charset=gb2312">

</head>

<body>

<%out.print("JSP     ");%>

</body>

</html>

첫 번째 <%@pagelanguage="java"pageEncoding="gb2312"%>에서 페이지의 인코딩 형식을 지정했습니다. jsp 파일의 저장 형식은 이 인코딩 형식입니다. Eclipse는 이 인코딩 형식에 따라 파일을 저장합니다.안에 있는 한자를 포함하여 jsp 파일을 컴파일합니다.
두 번째 인코딩은 디코딩 형식이다.gb2312로 저장된 파일은 iso8859-1로 디코딩되기 때문에 중국어가 있으면 틀림없이 인코딩이 잘못될 것입니다.즉, 반드시 의견 차이가 있어야 한다.만약 두 번째 줄에 이 줄이 없다면 시스템은 기본적으로 iso8859-1의 인코딩 형식을 적용합니다.그래서 이 줄이 없으면 난장판도 생길 수 있다.의견 차이가 있어야만 된다.
이 줄은 jsp 페이지에서 문자가 어떤 인코딩 형식으로 표현되는지, 즉 최종적으로 보이는 웹 페이지 내용의 인코딩 형식을 담당한다.
참고: <%@pagelanguage="java"pageEncoding="%>이(가) 지정했고, <%@page contentType="text/html;charset="%>이(가) 지정되지 않으면 기본값은 iso8859-1 인코딩 형식입니다.반대로, 그것들의 인코딩 형식은 비슷하다.
    
세 번째 인코딩은 브라우저의 디코딩을 제어하는 방법이다.만약 뒤의 디코딩이 모두 일치하지 않고 틀림없다면, 이 인코딩 형식은 설정하지 않아도 된다.어떤 웹 페이지에 난코드가 생기는 것은 브라우저가 어떤 인코딩 형식을 적용할지 확실히 알 수 없기 때문이다.페이지가 때때로 페이지에 삽입되기 때문에 브라우저가 인코딩 형식을 혼동하여 난코드가 발생했다.
참고: <%@page contentType = "text/html;charset="%>은(는) 브라우저의 인코딩 형식을 지정합니다. jsp 페이지에서 이것을 지정하면 meta http-equiv = "Content-Type"content= "text/html charset="> 은(는) 작동하지 않습니다.jsp에 <%@page contentType= "text/html;charset="%>가 없어야만 작동합니다.만약 그것들이 모두 존재한다면 <%@page contentType = "text/html;charset="%>가 우선입니다.
    
    
본문을 시작하겠습니다.
    
시나리오 1:
jsp 페이지는form 폼으로 제출 (method="post") 하고 servlet 파일에서request를 사용합니다.getParameter ("매개 변수 이름") 에서 전송된 값을 잃어버렸습니다.이곳은 왕왕 난장판이 생길 수 있다.
    
    
    
다음 예의 처리 방법은 정확하니 모두들 빨간 글자를 주의해서 보아라.
    
증결점: jsp의charset="utf-8"과value=new String(value.getBytes("ISO8859 1"), "utf-8");이 두 곳의 문자는 의견 차이를 유지해야 한다.
    
    index.jsp
    
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>

    
 
  <
    form name="form1"method="post"action="ConsumerServlet?method=0&sign=0"onSubmit="return userCheck()
">
    id="account"
='30'>
  

    
    ConsumerServlet.java
    
    
//       
	public void checkConsumer(HttpServletRequest request,HttpServletResponse response)
			                                                         throws ServletException, IOException {

    String account = Chinese.toChinese(request.getParameter("account"));
    consumerDao = new ConsumerDao(); ConsumerForm consumerForm = consumerDao.getConsumerForm(account); if (consumerForm = null) {request.setAttribute ("information", "입력한 사용자 이름이 존재하지 않습니다. 새로 입력하십시오!");else if (!consumerForm.getPassword().equals(request.getParameter("password")) {request.setAttribute("information", "입력한 로그인 비밀번호가 틀렸습니다. 새로 입력하십시오!)}else { request.setAttribute("form", consumerForm); }//확인 통과 후 RequestDispatcher requestDispatcher = request.getRequestDispatcher("dealwith.jsp"); requestDispatcher.forward(request, response); }
    Chinese.java(문제점)
                  
매일 같은 이치
생활의 어쩔 수 없는 것은 때때로 자아에서 비롯된 것이 아니라 다른 사람이 무심코 쌓은 것이다. 그것은 일종의 우연한 잘못이다.생활은 본래 모순된 것이다. 낮과 밤의 거리, 봄, 여름, 가을, 겨울 사이의 윤회가 있기 때문에 까다로운 사랑이 생겨서 어쩔 수 없이 기쁨의 기다림을 더했다.
public class Chinese {
    public  static String  toChinese(String value) {
           try {
               if (value == null) {
                   return "";
               } else {

    value = new String(value.getBytes("ISO8859_1"), "utf-8");
    return value; }//ISO88591의 인코딩 형식은value를 읽고 utf-8}catch (Exception e) {return ";}}}
    
이 코드는 바코드를 담당하고 있는데 아마 여러분은 빨간색 코드에 대해 잘 모르실 거예요. 제가 여기에 JAVA API의 설명을 붙여 놓을게요.
    
    public byte[] getBytes( String  charsetName)
               throws UnsupportedEncodingException
지정된 문자 세트를 적용하여 이 String을 바이트 시퀀스로 디코딩하고 결과를 새 바이트 배열에 저장합니다.
이 문자열이 주어진 문자를 부호화할 수 없을 때, 이 방법은 지정한 행위가 없습니다.디코딩 과정을 더 제어할 필요가 있을 때 CharsetEncoder류를 적용해야 한다.
매개변수:
charsetName - 지원되는 이름charset
반환:
결과 바이트 배열
던지기:
UnsupportedEncodingException - 지정된 문자 세트가 지원되지 않는 경우
    
    public String(byte[] bytes,
              String  charsetName)
       throws UnsupportedEncodingException
지정된 문자 세트를 적용하여 지정된 바이트 배열을 디코딩하여 새 String을 구성합니다.새 String의 길이는 문자 세트 함수이므로 바이트 배열의 길이와 같을 수 없습니다.
주어진 바이트가 주어진 문자가 올바르지 않은 경우, 이 구조 방법은 지정된 행위가 없습니다.디코딩 과정을 더 제어할 필요가 있을 때 CharsetDecoder류를 적용해야 한다.
매개변수:
bytes - 문자로 디코딩할 바이트
charsetName - 지원되는 이름charset
던지기:
UnsupportedEncodingException - 지정된 문자 세트가 지원되지 않는 경우
    
    
    
시나리오 2:
form 양식의 다른 형식(Submit 사용).
    
    
다음은 다음과 같은 커밋 페이지(submit.jsp)입니다.
<%@ page contentType="text/html; charset=gb2312"%>

 <html>

<head><title>JSP     </title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<form name="form1" method="post/get" action="process.jsp">

<div align="center">

<input type="text" name="name">

<input type="submit" name="Submit" value="Submit">

</div>

</form>

</body>

</html>

다음은 처리 페이지
    (process.jsp)
코드:
    
    
<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP     </title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>

중국어를 입력하면 코드가 깨지고 처리 방법이 동일합니다.
    
    
<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP     </title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%

String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;

out.print(s);

%>

</body>

</html>

그럼 OK.
    
    
    
분석:
Tomcat은 기본적으로 ISO-8859-1 방법으로 수치를 읽지만 실제 문자의 인코딩은 jsp 페이지의 페이지 엔코딩이 지정해야 한다(일반적으로 iso-8859-1은 아니다). 그러면 읽은 후에 표현된 인코딩 형식과 저장된 형식이 다르지 않아 인코딩이 엉망이 된다.
    
우리의 디코딩은 바로 이 문제를 처리했다. 우리는 ISO-8859-1 포맷 디코딩 문자열을 먼저 응용한 다음에 페이지 Encoding과 의견 차이가 있는 인코딩 포맷 디코딩 바이트 그룹을 이용하여 읽은 후에 표현된 인코딩 포맷과 저장된 포맷의 의견 차이, 난코딩 문제를 처리한다.
    
    
    
    
인터넷에서 검색한 다른 처리 방안:
    
Request를 통해seCharacterEncoding ("gb2312") 은 요청을 같은 인코딩합니다.
    
수정된 프로세스입니다.jsp 코드는 다음과 같습니다.
    
<%@ page contentType="text/html; charset=gb2312"%>

<%request.setCharacterEncoding("gb2312");%>

<html>

<head>

<title>JSP     </title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>

    
테스트를 통해 이 방법은 안 됩니까, 아니면 부호화되었습니까? 누가 설명해 주시겠습니까???
    
    
    
    
    
    
미완속~~~
    
                   
               
    
    
    
    
    
문장 끝은 여러분에게 프로그래머의 몇 가지 우스갯소리 어록을 공유합니다. 최근 몇 년 동안의 인터넷은 정말 중국을 오락했습니다. 네티즌들은 각양각색의'문'에서 이리저리 뚫고 다녔고 또 많은'형', 많은'제'가 있습니다. 여러분들이 음미해 보실 만한 가치가 있습니다. 인터넷 고전 어록은 IT와 인터넷에 관한 것입니다. 고전은 여러분과 공유합니다!
--------------------------------------오리지널 기사 By 포맷 및 인코딩 -----------------------------------------------

좋은 웹페이지 즐겨찾기