2012-12-29 1 views
0

XML 파싱에 expat을 사용하려고했지만 XML 파일에 러시아어 기호가 있습니다.이 기호는 expat에 의해 잘못 해석됩니다.러시아어 문자셋과 함께 expat-parser를 사용하는 방법은 무엇입니까?

나는 expired_str 가지고 : Р В РЎС "РЎРѓРЎРѓР С"Р С'Р в "- С‚РВμР С"СЃС‚

대신 :

static int xmlParseStartup(char *buffer, int n, START_UP_T *startUp_sp) 
    { 
     void *buff; 
     XML_Parser parser_p = XML_ParserCreate("UTF-8"); 

     if (!parser_p) 
     { 
      DEBUG("Unable to create parser!\n"); 
      return RES_ERR; 
     } 
     XML_SetUserData(parser_p, (void *)startUp_sp); 
     XML_SetElementHandler(parser_p, startElement, endElement); 

     buff = XML_GetBuffer(parser_p, n); 

     memcpy(buff, buffer, n); 

     if (XML_STATUS_ERROR == XML_ParseBuffer(parser_p, n, TRUE)) 
     { 
      DEBUG("%s at line %" XML_FMT_INT_MOD "u\n", 
        XML_ErrorString(XML_GetErrorCode(parser_p)), 
        XML_GetCurrentLineNumber(parser_p)); 
      return RES_ERR; 
     } 
     return RES_OK; 
    } 

static void XMLCALL startElement(void  *userData, 
           const char *name, 
           const char **atts) 
{ 
    int i; 
    START_UP_T *startUp_sp = (START_UP_T *)userData; 
    for (i = 0; i < startUp_sp->depthPtr; i++) 
    { 
     fprintf(stderr, "."); 
    } 
    DEBUG("[%d]name: %s\n", startUp_sp->depthPtr, name); 

    if (0 == strcmp(name, "response")) 
    { 
     if (0 == strcmp(atts[i], "result")) 
     { 
      startUp_sp->result = atoi(atts[3]); 
      DEBUG("RESULT: %d\n", startUp_sp->result); 
     } 
     else if (0 == strcmp(atts[i], "status_str")) 
     { 
      strcpy(startUp_sp->expired_str, atts[3]); 
      DEBUG("EXPIRED_STR: %s\n", startUp_sp->expired_str); 
     } 
     else if (0 == strcmp(atts[i], "status_width")) 
     { 
      startUp_sp->status_width = atoi(atts[3]); 
     } 
    } 

    startUp_sp->depthPtr += 1; 
} 

static void XMLCALL endElement(void  *userData, 
           const char *name) 
{ 
    START_UP_T *startUp_sp = (START_UP_T *)userData; 
    startUp_sp->depthPtr -= 1; 
} 
: Русский 여기

을 Текст 내의 cutted 코드는

XML 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<startup> 
    <response name="result" value="0"/> 
    <response name="status_str" value="Русский текст"/> 
    <response name="status_width" value="120"/> 
</startup> 

답변

1

당신 GE t는 UTF-8 char * 타입 문자열의 cp1251 표현이므로 expat이 실제로 잘 작동합니다. 문제가있는 콘솔 출력입니다.

그렇지 않은 경우 xml 파일의 시작 부분 (ASCII 코드의 경우 239, 187, 191 바이트 또는 CP-1251에서는 따옴표없이 "п> ї")에서 utf8 표식을 확인하십시오.

한 번 더 : .xml 파일의 실제 인코딩을 확인해야합니다 (utf-8). 파일을 만들 때 어떤 편집기를 사용합니까?

UTF-8 "Русский текст"문자열의 CP1251 표현은 "Р С_С_С_РєРёР№ С'РчРєС_С '"입니다.

+0

나는 XML 파일 엔코딩 : (ANSI as UTF-8) 여기 혼란 스럽다. nodepad ++를 사용한다. VS *에 의해 "UTF-8"로 저장된 main 함수를 가진 파일 * .c. 이제 XML 파일을 읽은 후 잘못된 결과가 나타납니다. "" –

+0

* .c 파일의 변경 사항을 Windows-1251로 되돌립니다.), 같은 인코딩의 XML 파일. 또한 NULL 포인터를 사용하여 XML_ParserCreate 루틴을 호출합니다. 두 개의 표준 출력이 있습니다. 구문 분석하기 전에 : "". 구문 분석 후 : "EXPIRED_STR : Р СѓСЃСЃРєРёР№ С,РμРєСЃС,". 그것을 고치는 방법? –

+0

UTF-8로 ANSI는 "처음에는 유니 코드 마커가 없습니다"를 의미합니다. 유니 코드로 저장해야합니다. –

관련 문제