티스토리 뷰
"영어는 잘되는데 한글은 깨져요"
자바 웹 개발자로 살아오면서 숱하게 겪고 숱하게 들어본 질문인 것 같습니다.
저 역시 많이 겪었고 인터넷 검색을 통해서 해결 해왔던것 같습니다.
하지만 웹 개발을 수년간 해오면서 진의를 파악하지 못한채 인터넷에 널린 해답지 같은 코드를 이것저것 붙여 넣
어서 "황소 뒷걸음치다 쥐 잡듯" 이 우연히 해결 했던것 같습니다.
그런데 사실을 정확하게 인지 하고 있으면 문제에 대해서 근복적으로 접근할수 있기 때문에 웹 개발하면서 한글깨짐(결국 인코딩) 에 영향을 주는 여러 요인 조각들을 두서 없이 적어 보려 합니다.
1. jsp Page Directive
1 | <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> | cs |
1 2 3 | <% String name = "4퍎틠햤"; %> | cs |
1 2 3 4 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> | cs |
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 274
Date: Wed, 23 Apr 2014 07:10:27 GMT
2. Get 방식요청과 한글
브라우저에서 html 통한 문자 전송시 ISO-8859-1 charset 이외에 문자들은 인코딩이 돼서 문자가 서버 측으로 전송하게 됩니다. 그리고 서버 측은 인코딩된 문자를 받아서 다시 디코딩 하는 과정을 통해서 문자를 복원합니다.
보통 화면에서 입력한 한글이 서버에 와서 깨질 경우 이 과정을 통하는 사이에 인코딩 chatset 이 잘못되는 경우입니다.
Post는 한글이 안 깨지는데 Get 방식으로 전송하면 한글이 깨진 경우를 종종 겪을 수 있습니다. 걔다가 같은 Get 일 경우에 크롬은 되고 IE는 안될 경우도 있습니다. 왜 이런 경우가 생기는지 알아보겠습니다.
우선 크롬 브라우저로 페이지를 열고 아래처럼 Get 형태로 URL 호출합니다.
https://www.google.co.kr/?query=무명소졸
크롬의 관리자 도구로 보면 아래처럼 Request URL query 값이 인코딩 된 걸 확인할 수 있습니다.
Request URL:https://www.google.co.kr/?query=%EB%AC%B4%EB%AA%85%EC%86%8C%EC%A1%B8
Request Method:GET
Status Code:200
Remote Address:108.177.97.94:443
Referrer Policy:no-referrer-when-downgrade
1 2 3 4 | console.log(encodeURIComponent('무명소졸')); console.log(encodeURI('무명소졸')); //%EB%AC%B4%EB%AA%85%EC%86%8C%EC%A1%B8 //%EB%AC%B4%EB%AA%85%EC%86%8C%EC%A1%B8 | cs |
이함수를 통해서 클라이언트(브라우저) 쪽에서 인코딩해서 값을 전송 하는것이 좋은 해결 방법이 될수 있습니다.
3. Post 방식요청과 한글
위에서 언급 했듯이 한글을 서버로 전송 할경우 인코딩 과정을 거쳐야 되고 해당 인코딩의 charset 에 설정은 요청 페이지의 응답 header 정보의 charset 또는 html meta tag 의 charset 속성정보를 따른다고 했습니다.
하지만 그렇게 인코딩을 잘해서 전송해도 서버에서는 한글 깨짐을 만나는 경우가 많습니다.
그리고 그 해결책으로 아래와 같은 방식을 많이 사용하게 됩니다.
1 2 | String param = request.getParamater("name"); String name = new String(param.getBytes("8859_1"), "utf-8"); | cs |
그런데 분명 UTF-8 인코딩 되서 잘 보냈는데 왜 8859_1 로 인코딩 해서 다시 UTF-8을 만들까요?
그건 아래 POST 전송의 http 전문을 확인 하면 알수 있습니다.
POST /receive.jsp HTTP/1.1
Host: 127.0.0.1:8081
Connection: keep-alive
Content-Length: 32
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://10.225.149.115:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
name="%EB%AC%B4%EB%AA%85%EC%86%8C%EC%A1%B8"
"Content-Type: application/x-www-form-urlencoded"
위 부분을 보면 charset 이 빠져 있습니다. 브라우저를 통해 전송할때 application/x-www-form-urlencoded media type 은 text/**** 일뿐 charset 자체를 지원하지 않기 때문입니다.
1 2 | request.setCharacterEncoding("utf-8") | cs |
'Web Development' 카테고리의 다른 글
[Python] Web Image Download (0) | 2014.03.31 |
---|---|
[자바] AES Encrypt Simple Java Source (0) | 2014.03.20 |
[웹개발] Unicode vs UTF-8 (0) | 2014.01.07 |
[웹개발] XSS 와 CSRF 차이점 (0) | 2013.12.19 |
[정규식] 정규식을 이용한 패스워드 생성 제약조건 [영어,숫자,특수문자 ] 1자 이상 (0) | 2013.10.10 |
- Total
- Today
- Yesterday