-- PHP

PHP5.3에서 json_encode 후 한글 깨짐

어린왕자악꿍 2016. 4. 21. 23:22

PHP로 API서버를 구축하는 도중 아래와 같은 문제가 나타났다.


json_encode 시 한글이 깨지는 현상

PHP5.3을 사용하고 있으므로 아래의 해결방법이 다른 버전에서는 다를 수 있다.
클라이언트에서 요청한 결과를 JSON형태로 응답하려고 하기에 아래와 같이 작업을 하였다.

$res['cd'] = 0;
$res['msg'] = 'OK';
$res['data1'] = '확인';

$json = json_encode ( (object) $res );
echo $json;

위의 값을 클라이언트에서 파싱해보면 cd, msg는 정상적이지만 data1의 값은 깨진다.
json_encode를 통해 한글이 깨짐을 알 수 있는데, 필자는 urlencode, urldecode를 통해 이를 해결하였다.

$res['cd'] = 0;
$res['msg'] = 'OK';
$res['data1'] = urlencode ('확인');

$json = json_encode ( (object) $res );
$json = urldecode ($json);
echo $json;

혹시 PHP의 다른 버전들에 대해서도 테스트할 기회가 생긴다면 버전별로 이 포스트에 정리하도록 하겠다.



추가) 2016.04.21

DB에서 가져온 한글데이터 역시 json_encode 후 제대로 표현되지 않았다.
필자는 MSSQL을 이용했지만, 참조한 사이트에서는 MySQL인 경우에도 마찬가지였다.

function han ($s) { return reset(json_decode('{"s":"'.$s.'"}')); }

function to_han ($str) { return preg_replace('/(\\\u[a-f0-9]+)+/e','han("$0")',$str); }

// DB로부터 받은 값을 변수에 저장
while($e = mysql_fetch_assoc($result)){
$output[] = $e;
}
 
$encode = json_encode($output);
print (to_han($encode));

PHP5.3인 경우에 위와 같은 방식으로 해결이 되었다.