javascript 에서 제공하는 encodeURI()와 encodeURIComponent() 함수는 기본적으로 UTF-8으로 인코딩을 합니다
이를 Query로 하여 jsp 페이지에 넘겨서
request.getParameter() 함수로 받고서 아무 의심없이 URLDecoder.decode() 함수를 사용했습니다
당연히 UTF-8으로 decode를 했지요
하지만 계속해서 한글이 깨져있습니다;;;
계속 원인을 찾던 중
tomcat이 Query를 미리 서버에 지정된 기본 문자셋으로 디코딩을 해버린다는 사실을 알았습니다
즉, request.getParameter()로 받은 결과가 인코딩 된 문자열이 아닌 이미 디코딩 된 문자열이었지요
즉, 기대한 값은 %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94 과 같은 모양의 문자열인데
이미 저 값은 URLDeocder.decode( 문자열, 서버 기본 문자셋 ) 함수로 한번 디코딩 된 결과 같이 나온다는 거에요
많은 경우 서버 기본 문자셋이 MS-949 등이기 때문에 UTF-8으로 인코딩 된 값을 잘못 디코딩한 것이죠
잘못 디코딩된 녀석을 다시 디코딩 해봤자 한글이 깨져있는 것은 당연한 것이지요...
1. 해결 방법으로는 서버 기본 문자셋을 UTF-8으로 바꿔버리는 방법과...
2. 데이터의 양이 늘어나지만 encodeURI() 또는 encodeURIComponent() 의 결과를 한번 더 인코딩 해버리는 방법도 있습니다
encodeURIComponent( encodeURIComponent( plainText ) ); // 이렇게요
그리고 jsp에서는 URLDecoder.decode() 함수를 한번만 ( 한번은 자동으로 디코딩을 수행하기 때문에 ) 호출하면 됩니다
이렇게 될 경우 tomcat이 자동으로 디코딩한 결과는 원래 기대 값인 인코딩 된 값
%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94 과 같은 모양의 문자열
이 되고, 이를 URLDecoder.decode() 함수로 제대로 디코딩 해주기 때문에 원하는 결과 값이 나오게 됩니다