회사일로 XML파싱관련 작업을 처리하던 중에
문제가 생겼다.
바이너리 코드가 XML데이터에 포함될경우 파싱이 중간에 중단되는 현상이 발생한 것이다.
해결책이 없는지 이리저리 알아보던중 다음과 같은 내용을 발견했다.
대충 직역해 보면 xml_parse를 이용해서 파싱할 경우에
문제가 생겼다.
바이너리 코드가 XML데이터에 포함될경우 파싱이 중간에 중단되는 현상이 발생한 것이다.
해결책이 없는지 이리저리 알아보던중 다음과 같은 내용을 발견했다.
xml_parse() crashes when xml file
contains chars \x00 - \x1f, so be careful! I solve this problem simple:
<?php
$bad_chr =
array("\x00" =>
"chr(0)", "\x01" => "chr(1)", "\x02" => "chr(2)", "\x03" => "chr(3)", "\x04" => "chr(4)", "\x05" => "chr(5)", "\x06" => "chr(6)", "\x07" => "chr(7)", "\x08" => "chr(8)", "\x09" => "chr(9)", "\x0a" => "chr(10)", "\x0b" => "chr(11)", "\x0c" => "chr(12)", "\x0d" => "chr(13)", "\x0e" => "chr(14)", "\x0f" => "chr(15)", "\x10" => "chr(16)", "\x11" => "chr(17)", "\x12" => "chr(18)", "\x13" => "chr(19)", "\x14" => "chr(20)", "\x15" => "chr(21)", "\x16" => "chr(22)", "\x17" => "chr(23)", "\x18" => "chr(24)", "\x19" => "chr(25)", "\x1a" => "chr(26)", "\x1b" => "chr(27)", "\x1c" => "chr(28)", "\x1d" => "chr(29)", "\x1e" => "chr(30)", "\x1f" => "chr(31)");
xml_parse($xml_parser, strtr($data, $bad_chr), feof($fp));
//....
$parsed_data = strtr($parsed_data, array_flip($bad_chr));
?>
대충 직역해 보면 xml_parse를 이용해서 파싱할 경우에
\x00에서 \x1f까지의 무자코드를 가진 글자를 만나게 되면 충돌이 나니 주의해라 정되 되겠다.
글을 남긴 사람은 해결책으로 해당 캐릭터를 변경시켰다가, 다시 되돌리는 방법을 취하고 있다.
하지만 멀티바이트 문자에서는 동작을 안하니 일본어나 한국어에서는 그냥 ""로 치환해서 처리하자.
'프로그래밍 > PHP' 카테고리의 다른 글
함수 존재 확인, 메소드 존재 확인 (0) | 2009.10.01 |
---|---|
.htaccess 파일 관련 (0) | 2009.09.25 |
xml 파서 (0) | 2009.06.15 |
if문의 새로운(?) 문법. (2) | 2009.06.03 |
플로이드 알고리즘 : 최단거리검색 (0) | 2009.05.26 |