티스토리 뷰
최근의 웹페이지들은 UTF-8인코딩을 채용하는 경우가 점점 늘어나고는 있지만 윈도우 환경이 지배적인 한국에서는 여전히 EUC-KR인코딩 내지 CP949 인코딩을 지원해야하는 것은 한국 개발자들의 숙명이 아닌가 싶습니다.
최근 PHP 환경에서 인코딩 변환을 하다가 문제를 해결한 사례를 메모해 둡니다.
웹서버는 UTF-8 인코딩으로 웹페이지 및 MySQL 데이터베이스에 저장하는 체계인데 서너개의 테이블을 조인해서 엑셀로 내려받기하는 기능을 추가하려 했습니다.
DB 쿼리도 문제없고 테스트 과정에서 댓글도 하나로 잘 조인 되었습니다.
SELECT t.id, t.type ttype, FROM_UNIXTIME( t.time /1000000 ) ctime, t.priority, t.owner, t.reporter, t.cc, t.milestone, t.status, t.resolution, t.summary, COUNT(at.id) atcnt, GROUP_CONCAT(TRIM(chg.newvalue) SEPARATOR '\n===========\n') chgcmt FROM ticket t LEFT OUTER JOIN attachment at ON t.id = at.id AND at.type='ticket' LEFT OUTER JOIN ticket_change chg ON t.id = chg.ticket AND chg.field='comment' AND chg.newvalue <> '' GROUP BY t.id ORDER BY t.id
협업 개발 시스템인 Trac의 테이블을 내려받는 것인데 티켓 테이블을 중심으로 해서 첨부 파일의 개수를 조인해서 추출하고, 댓글은 "GROUP_CONCAT()"함수를 사용해서 하나로 묶어 한 컬럼에 표시하도록 했습니다.
echo iconv("UTF-8", "EUC-KR", "{$row[id]}\t{$row[ttype]}\t{$row[ctime]}\t". "{$row[priority]}\t{$oname}\t{$rname}\t{$ccname}\t{$row[milestone]}\t{$row[status]}\t". "{$row[resolution]}\t{$row[summary]}\t{$row[atcnt]}\t\"$chgcmt\"\n");
UTF-8 인코딩인 서버 시스템의 자료를 윈도우 엑셀에서 열수 있도록 EUC-KR 또는 CP949 인코딩을 변환하기 위하여 iconv("UTF-8", "EUC-KR", ...);를 사용했으나 특정 행이 통째로 사라지는 일이 발생했습니다. 한참을 추적하다보니 댓글에 이상한 문자가 있는 행에 대해서 iconv가 실패하는 문제였습니다. 이런 문제는 인코딩 변환 과정에서 변환 불가 문자를 무시하도록 처리하면 안전하게 처리할 수 있습니다. iconv의 두번째 파라미터가 결과 문자열의 인코딩인데 그 뒤에 "//IGNORE" 옵션을 붙이면 변환 과정이 실패하지 않도록 조치할 수 있습니다.
iconv("UTF-8", "EUC-KR//IGNORE", ...);
//TRANSLIT옵션을 붙이면 변환 불가 문자를 가장 유사한것으로 변환합니다.
'프로그래밍' 카테고리의 다른 글
올림피아드 기출문제로 배우는 C언어 - 프로그램 읽기1 (0) | 2016.04.21 |
---|---|
올림피아드 기출문제로 배우는 C언어 - 복합 대입 연산자 (0) | 2016.04.21 |
올림피아드 기출문제로 배우는 C언어 - 알고리즘 찾기 (0) | 2016.04.08 |
PHP 플래시 차트 출력의 실제 (2) | 2016.04.08 |
올림피아드 기출문제로 배우는 C언어 - 배열와 포인터 (0) | 2016.04.07 |