티스토리 뷰

728x90

최근의 웹페이지들은 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옵션을 붙이면 변환 불가 문자를 가장 유사한것으로 변환합니다. 

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함