Expat XML Parser 에서 한글(EUC-KR) 처리하기
Expat XML Parser는 ISO-8859-1 (latin1), ascii, utf-8, utf-16 의 4가지 문자코드만을 지원합니다.
그래서 한글이나 기타 다른 언어를 파싱하려면 별도의 처리를 해줘야만 하죠.
Expat 소스를 직접 수정하는 방법도 있지만,
핸들러를 등록하여 사용할 수 있습니다.
Expat 에서 지원하지 않는 인코딩 타입을 만나면 XML_SetUnknownEncodingHandler( ) 함수에서 등록된 핸들러가 호출됩니다.
이 핸들러는 XML_SetUnknownEncodingHandler( ) 함수를 이용하여 내가 설계한 핸들러를 등록하는데,
핸들러 타입은 XML_UnknownEncodingHandler 이며 타입 선언은 다음과 같습니다.
typedef int (XMLCALL *XML_UnknownEncodingHandler) (void *encodingHandlerData,
const XML_Char *name,
XML_Encoding *info);
이렇게 핸들러 함수 'unknownEncodingHandler'를 등록하고
XML_SetUnknownEncodingHandler(m_saxParser, unknownEncodingHandler, NULL);
아래처럼 코드 작성을 하면 됩니다.
그리고 실제 인코딩을 위한 함수를 'info->convert'에 등록하면 됩니다.
물론 구현도 해야겠지요... (unicode로 변환하면 됩니다)
XML_SetUnknownEncodingHandler() |
static int XMLCALL unknownEncodingHandler (void *encodingHandlerData,const XML_Char *name, XML_Encoding *info) { info->data = (void*)name; //character set ('euc-kr', 'euc-jp' 등등) info->convert = convert_charset; //핸들러등록 info->release = NULL; int i=0; // 0x00 ~ 0x7f for(i=0; i<0x80; ++i) info->map[i] = i; // 0x80 ~ 0xff //'-2'는2byte를소모한다는의미(한글과같은유니코드) for(;i<=0xFF; ++i) info->map[i] = -2; return 1; } |
아래 링크에 하게 설명되어 있으니 링크를 따라가서 보셔야 합니다.