html 저장시 utf-8 헤더를 붙였으나 브라우저 encoding 설정이 자동인 경우 한글이 깨지는 현상

반응형
다음 세가지를 확인 한다.

1. html 저장시 utf-8형식으로 저장한다 : window에서는 default로 ascii(ansi?)로 저장을 한다.
2. 웹서버의 default 설정을 확인 한다.
(
http response header 의 Content-Type 의 값
Content-Type: text/html; charset=UTF-8
apache 의 httpd.conf 에 AddDefaultEncoding 값을 쓰면 charset 에 이 값이 들어가죠.
)
3.html 앞에 서버쪽 언어를 이용하여 utf-8로 설정 확인
(예:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> )


대부분 1번에서 해결됨을 확인 할 수 있다.

다음은 검색해서 찾은 참조 문서들...(이렇게 긁어와도 되나-_-;)

 출처:

Ht
tp://mwultong.blogspot.com/2006/05/unicode-utf-8.html
---------------------------------------------------------------
(1) 보통의 한국어 텍스트 문서:
이것은 아스키 문서이며 유니코드가 아닙니다. 영문/숫자/기호는 1바이트. 한글과 한자는 2바이트로 표현됩니다. euc-kr 또는 ksc_c_5601-1987 로 불리는 인코딩이며 웹페이지 작성에 사용할 수 있습니다. 특수한 외국어 문자나 일본식/중국식 한자는 표현할 수 없습니다.

다음의 2개가 유니코드입니다:

(2) 일반 유니코드(Unicode): 모든 글자를 2바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 인터넷에 HTML 파일로 올릴 수 없습니다. 즉 웹페이지 작성에 쓸 수 없습니다.

(3) UTF-8 유니코드: 영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 웹페이지 작성에 쓸 수 있습니다. (저의 mwultong.blogspot.com 이 블로그도 UTF-8 로 되어 있습니다)



MS윈도우2000/XP 이상에서는, 외부적으로는 '일반 아스키 인코딩(1번)'을 사용하고, 내부적으로는 '일반 유니코드(2번)'를 사용합니다.

유닉스/리눅스/오픈소스 진영에서는 (1)번 또는 'UTF-8 유니코드(3번)'를 기본으로 사용합니다.

그렇지만 윈도 메모장에서도 UTF-8 유니코드 문서를 읽고 저장할 수는 있습니다.
-----------------------------------------------------------------

이엠에디터(EmEditor)를 사용해 변환



풀다운 메뉴의
        File/
        Save As(다른 이름으로 저장)/
에서 나온 대화상자에서

Encoding(인코딩)을 Unicode 나 UTF-8 로 지정한 후 "저장" 버튼을 누릅니다.




(윈도우에 기본으로 설치되어 있는) 메모장을 사용해 변환



풀다운 메뉴의
        파일/
        다른 이름으로 저장/
에서 나온 대화상자에서

"인코딩"을 "유니코드"나 "UTF-8"로 지정합니다. 특별한 이유가 없는 이상, "유니코드 (big endian)"은 선택하지 마세요.




울트라에디트(UltraEdit)를 사용해 변환:



풀다운 메뉴의
        File/
        Conversions(변환)/
에서

ASCII To Unicode : 현재 한글 문서를 유니코드로 변환

ASCII To UTF-8 (Unicode Editing) : 현재 한글 문서를 유니코드(UTF-8)로 변환






일반 아스키 텍스트 파일을 유니코드로 변환할 때에는 또는 그 반대로 변환할 때에는, 이엠에디터(EmEditor)로 변환하는 것이 가장 안정적입니다. 울트라에디터의 경우에는 버그가 있어서 글자들이 깨지는 경우가 많습니다.

------------------------------------------
다음은 참조..
http://blog.theple.com/joeinfo/folder/27.html?uid=245
XMLHttpRequest 사용시 한글 파라미터 전송 방법
[프린트 형식으로 보기]
XMLHttpRequest 사용시 한글 파라미터 전송 방법

자바캔에 실린 'XMLHttpRequest를 이용한 웹 채팅 구현'이란 글에서 한글 문제를 iframe을 사용하여 해결했는데, 그 방식 말고 자바캔의 댓글 추가에서 사용한 한글 처리 방식에 대해서 설명해보도록 하겠다.

XMLHttpRequest의 한글 파라미터 문제 해결 방법에 대해서 살펴보기 전에, 웹브라우저가 파라미터 값을 전송할 때 어떻게 인코딩하는 지 살펴보도록 하자. 대부분의 한글 사이트는 다음과 같이 캐릭터셋이 "euc-kr"인 HTML 문서를 사용할 것이다.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr" />
<title>test</title>
</head>
<body>
<form name="test" action="form.jsp">
<input type="text" name="name" /><input type="submit"/>
</form>
</body>
</html>

위 문서는 name 파라미터를 form.jsp로 전송하는 FORM을 갖고 있는데, name 필드에 '한글'을 입력한 뒤
submit 버튼을 누르면 다음과 같이 파라미터 값이 변환되어 전송된다.

    euc-kr 캐릭터셋에 맞춰 '한글' 을 인코딩한 값

http://..../form.jsp?name=%C7%D1%B1%DB

위에서 '%C7%D1%B1%DB'는 '한글'을 euc-kr 캐릭터셋에 맞춰서 인코딩한 결과이다.
IE나 파이어폭스 등의 웹 브라우저는 문서의 캐릭터셋에 맞춰서 파라미터를 인코딩하여 전송하기 때문에, 만약 문서의 캐릭터셋이 utf-8 이면 '한글' 파라미터를 다음과 같이 인코딩하여 전송하게 된다.

    
utf-8 캐릭터셋에 맞춰 '한글' 을 인코딩한 값

http://..../form.jsp?name=%ED%95%9C%EA%B8%80

문서 캐릭터셋이 euc-kr인 경우와 utf-8인 경우 전송되는 파라미터의 인코딩된 값도 다른 것을 확인할 수 있다.

이제, 다시 본론으로 돌아와서 XMLHttpRequest가 전송하는 파라미터에 대해서 살펴보자. XMLHttpRequest도 파라미터를 웹서버에 전송하기 때문에 파라미터 값을 알맞게 인코딩 해 주어야 한다. 그런데, 아쉽게도 XMLHttpRequest 자체적으로 인코딩 처리를 지원해주지는 않는다. 따라서, 자바스크립트가 지원해주는 인코딩 처리 함수를 사용해야 한다. 자바 스크립트가 제공하는 인코딩 처리 함수는 escape()와 encodeURIComponent()의 두가지가 있다. 이 두가지는 동작 방식이 다른데, 다음표는 두 함수의 실행 결과를 보여주고 있다.

인코딩 처리 인코딩된 값 설명
두 함수의 실행 결과는 문서 캐릭터셋이 euc-kr 이거나 utf-8 인 경우 모두 동일하다.
escape('한글') %uD55C%uAE00 유니코드 값을 표현
encodeURIComponent('한글') %ED%95%9C%EA%B8%80 utf-8로 인코딩. encodeURI() 함수도 동일한 결과 출력

두 함수의 실행 결과를 보면 encodeURIComponent() 함수가 utf-8로 인코딩한 결과를 보여줌을 알 수 있다. 따라서, XMLHttpRequest로 한글 파라미터를 전송할 때에는 다음과 같은 방법을 사용하면 된다.

  • 웹브라우저에서: 자바스크립트 encodeURIComponent() 함수를 사용하여 파라미터 값을 utf-8로 인코딩하여 전송한다.
  • 서버에서: 파라미터 값을 utf-8로 디코딩하여 읽어온다.

웹브라우저의 코드를 작성하면 다음과 같을 것이다. (POST 방식으로 전송할 때에도 같은 방법으로 파라미터를 인코딩하면 된다.

)
    <script type="text/javascript">
function sendData() {
var xmlHttp = null;
if( window.XMLHttpRequest ){
xmlHttp = new XMLHttpRequest();
}
else{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}

if( xmlHttp ){
var nameVal!ue = document.memberForm.name.value;
var idValue = document.memberForm.id.value;
var param = "name="+encodeURIComponent(nameVal!ue)+"&id="+encodeURIComponent(idValue);
xmlHttp.open('GET', 'http://www.some.com/receive.jsp?'+param, true);

xmlHttp.onReadyStateChange = function(){
if( xmlHttp.readyState == 4 ){
alert!(xmlHttp.responseText);
}
}
xmlHttp.send(null);
}
}
</script>

서버에서는 파라미터를 utf-8로 읽어오기만 하면 된다. 예를 들어, JSP를 사용한다면 다음과 같이 파라미터의
인코딩을 utf-8로 지정하면 된다.

    <%
request.setCharacterEncoding("utf-8");
...
String name = request.getParameter("name");
%>
반응형

'IT' 카테고리의 다른 글

WebService의 진화(?) REST Architecture..  (0) 2009.07.06
RequestDispatcher & sendRedirect 방식  (0) 2009.03.31
인터넷보안설정PC - 팝업차단  (0) 2009.03.31

Top