가희의자기개발블로그

한글처리 본문

백엔드/JSP

한글처리

가희gahui 2020. 7. 9. 19:06
반응형

HTML이나 JSP파일로 코드를 작성했을 떄, 한글이 깨지는 현상이 자주 발생한다. 이는 파일의 인코딩 방식과 웹 브라우저가 사용하는 인코딩 방식이 서로 달라서 발생하는 문제이다. 이 인코딩 방식을 통일 해 주어야 한다.

좀 더 자세히 설명하자면, 영어 알파벳은 ASCII코드가 어느 cHARACTERSET에나 기본적으로 포함되어 있기 때문에 어떠한 인코딩을 사용하든지 깨질 일이 없지만 한글의 경우에는 EUC-KR, UTF 계열 인코딩 등 특정 캐릭터셋이 아니면 한글을 표현하지 못해 깨지는 현상이 발생한다. 

 

웹 환경에서의 데이터는 보통 브라우저(클라이언트) - 서버 - DB서버 처럼 3계층에 거져 주고 받게 되는데 이때 세가지 요소의 인코딩이 서로 맞아야한다. 

데이터를 입력받거나 출력하는 통로를 스트림이라고 하는데 얼핏 보기에는 하나의 스트림을 통해 데이터를 주고 받는것처럼 보이지만 사실은 입력스트림과 출력스트림을 통해 데이터를 각각 입력 및 출력하기 때문에 각 스트림의 데이터 형식을 맞춰 주어야 한다.

 

예를들어 브라우저에서 보낸 한글 데이터를 웹서버에서 UTF-8로 받은 후 웹서버에서 DB서버로 ISO-8859-1같은 한글을 표현할 수 없는 캐릭터셋으로 보낸다면 이 과정에서 한글이 깨지게 된다.

또는 웹서버에서 DB서버로 한글을 UTF-8형식으로 잘 보냈지만 DB 서버에서 받을때 ASCII 로 받는다면 한글 인코딩 문제가 발생할 것이다.

 

인코딩 방식

현재 한국에서 사용되는 인코딩 방식은 크게 두가지가 있다. 바로 EUC-KR방식와 UTF-8방식인데

 

EUC-KR 방식은 원래 영어만을 고려한 1byte 길이의 ASCII라는 인코딩 방식을 확장해서 한글을 사용할 수 있도록 만든 2byte 길이의 국가 언어 코드이다.

국가 언어코드, 즉 우리나라에서만 쓸 수 있도록 만든 코드이며 세계 어디에서나 공콩으로 사용되는 인코딩 방식이 아니기  때문에, 다른 언어를 사용하는 환경에서는 한글 페이지를 제대로 볼 수 없는 문제가 발생한다.

 

이를 해결하기 위해 새로운 인코딩 방식이 개발되었는데, 그중 가장 보편화된 인코딩이 UTF-8이다.(3byte)

 

예전에는 용량이 작은 euc-kr방식을 선호하는 곳들도 많았는데 현재는 용량 문제보다 표준화및 글로벌 환경을 더 고려해야 하므로 UTF-8 인코딩 방식을 더 선호한다.

 

 

해결법

1.IDE설정을 UTF-8로 바꿔준다.

2. html 소스파일 <meta> 태그 charset설정

최신 IDE를 사용한다면, 기본적으로 인코딩 방식은 UTF-8로 설정되어있다. 하지만 Windows 운영체제는 기본 인코딩 값으로 여전히 euc-kr방식을 사용하기 때문에, 이 페이지가 UTF-8방식으로 인코딩 되었음을 알려야 한다.

 

HTML5의 경우 다음 코드를 <head> 태그 안에 삽입하여 페이지 언어셋이 utf-8임을 브라우저에 알린다.

<meta charset="utf-8">

XTML의 경우 다음 코드를 <head> 태그 안에 삽입하면 된다.

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

2. JSP인 경우의 설정

JSP의 경우 page 디렉티브의 contentType 속성과 pageEncoding 속성의 셋을 다음 코드를 <head> 태그 안에 삽입힌다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

3.서블릿인 경우 인코딩 설정 

요청이 POST방식인 경우

setCharacterEncoding 설정을 통해 request객체와 response객체의 캐릭터셋을 한글을 표현할 수 있는 인코딩으로 셋팅해준다. 이 때 주의할점은 response.getWriter() 과 request.getParameter() 메서드 사용 이전에 셋팅해주어야 한다는 점이다.

req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");


출처: https://dololak.tistory.com/56 [코끼리를 냉장고에 넣는 방법]

 

URL 파라미터에 한글이 깨지는 경우

JSP -> JAVA -> JSP

첫 화면에서 한글 파라미터를 컨트롤러에서 받을 땐 한글이 깨지지 않았으나 다시 JSP로 넘겨줄 때 한글이 깨지는 경우, 인코딩 하여 넘겨주면 깨지지 않는다.

 

let encodeUrl = encodeURI("안녕하세요.");
//위 처럼 넘겨주고 최종 JSP페이지에서 아래와 같이 복호화 시켜준다.
let decodeUrl = decodeURI(변수);

자바스크립트에서 한글이 깨지는 경우

JAVA -> JSP

JAVA단에서는 한글이 잘 보이는데 JSP 페이지에서 깨지면, 우선 JAVA단에서 인코딩을 해준 뒤,

String korStr = URLEncoder.encode("이름이 뭐에요?","UTF-8")
//자바스크립트에서 복호화하면 된다.
let korStr = decodeURIComponent(변수)

외부 자바스크립트를 호출한 경우

JSP -> JSP

다른 자바스크립트 파일을 호출했는데 한글이 깨지는 경우

charset 을 스크립트 태그에 추가해준다. 

<script type="text/JavaScript" src="jsFile.js" charset="UTF-8"></script>

스프링 파라미터로 한글을 넘길때

JSP에서 Post방식으로 넘겨줬을 때 한글이 깨지는 현상이 발생한다. 그럴때는 web.xml파일에서 설정해 주어야 한다.

<!-- 스프링 파라메터로 한글을 넘길 때 -->
  <filter>
  	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>encodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

 

※encodeURI() / encodeURIComponent()의 차이

encodeURI()함수는 인코딩과 URI를 반환하며 기본적으로 UTF-8로 인코딩한다.

 

encodeURI()함수는 ":"",""/"",""?""."등의 문자를 인코딩하지 않는다. 이 문자들을 인코딩하려면 encodeURIComponent()를 사용해야 한다.

반응형

'백엔드 > JSP' 카테고리의 다른 글

Servlet  (0) 2020.07.13
JSESSIONID  (0) 2020.07.07
기초- JSP프로젝트 구조  (0) 2020.06.16
MVC  (0) 2020.06.16
Connection Pool  (0) 2020.06.12
Comments