[PHP/jQuery] euc-kr인코딩에서 Ajax 사용시 한글 깨짐 현상 문제 해결
해결 방법 : euc-kr 대신 utf-8을 쓸 것.
… 은 농담. 하지만 불가피한 상황 아니면 개발 초기에 utf-8을 이용해서 개발하는 것이 제일 좋다. euc-kr은 약간 문제가 있는 인코딩인지라 절대 추천할 수 없다.
여튼 jQuery에서 ajax를 사용하면 utf-8의 경우는 전혀 문제가 없는 반면 euc-kr의 경우 전달하는 데이터에 한글이 포함되어 있으면 글자가 깨지거나 아예 내용이 사라지는 현상이 발생한다. 이를 해결하기 위해선 다음과 같이 해주자.
예를 들어 호출 부분이 다음과 같이 있다고 가정하자.
vartoFindPerson = $(‘#keyword’).val();
$.ajax({
url:“/programme/person_finder.php“,
data:{
mode : “person”,
name : toFindPerson
},
type:“GET”,
… 그외 갖가지 …
});
여기서 한글로 데이터를 전달하는 부분을 다음처럼 encodeURIComponent 함수를 거치도록 해준다.
vartoFindPerson = $(‘#keyword’).val();
$.ajax({
url:“/programme/person_finder.php“,
data:{
mode : “person”,
name : encodeURIComponent(toFindPerson)
},
type:“GET”,
… 그외 갖가지 …
});
encodeURIComponent는 알겠지만 URL 형식으로 데이터를 넣을 수 있도록 문자열을 인코드한다. 결과적으로 name에는 %ED%97%90%EB%AD%90%EC%95%BC 뭐 이런식으로 데이터가 저장된다. 경우에 따라선 자동으로 변환해주나 브라우저 호환성을 위해 강제로 변환하게 하자.
우선 호출 부분에서는 한글로 전달되는 데이터만 저렇게 처리해주고, 처리 페이지(여기선 앞에 호출 부분에서 url에 명시된 /programme/person_finder.php)에서는 다음 함수들을 거치도록 한다.
<?php
$name = $_GET[‘name’];
// 1. 설명이 필요한가? 전달되는 방법(method)이 다르면 당연히 거기에 맞게 변경해준다.
$name = urldecode($name);
// 2. %ED%97… 식으로 변환된 문자열을 본래 형태의 문자열로 변환한다. 이 반대 역할의 함수는 당연히 urlencode.
$name = iconv(“utf-8”,“euc-kr”,$name);
// 3. 변환 이후에는 utf-8로 데이터가 남아서 이걸로 지지고 볶을 순 없다. euc-kr로 변환 후 볶아준다.
$name = mb_convert_encoding($name,“euc-kr”,“utf-8”);
// 4. 일부 서버에서는 iconv 함수를 지원하지 않는 경우도 간혹 있다. 그럴 경우 mb_string 계열 함수를 통해 변환을 해준다.
// 5. 필요하면 추가적인 보안조치(SQL Injection, XSS 필터등)를 해준다.
// 6. ????
// 7. PROFIT!
?>
PS. 카테고리 구분이 애매하네…