본문 바로가기

C/C++

Expat XML Parser 에서 한글(EUC-KR) 처리하기

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 *nameXML_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=0i<0x80; ++i)

               info->map[i] = i;

       

        // 0x80 ~ 0xff

        //'-2'2byte를소모한다는의미(한글과같은유니코드)

        for(;i<=0xFF; ++i)

               info->map[i] = -2;

 

        return 1;

 

}

 

아래 링크에 하게 설명되어 있으니 링크를 따라가서 보셔야 합니다.

 

http://blog.alienbaron.com/?p=205

http://blog.naver.com/nicholas/100027300724