2012-07-12 3 views
1

libxml2에서 xmlTextWriter을 사용하여 일부 xml 파일을 작성하고 있습니다. 그리고 나는 그들에게 키릴 문자를 써야합니다. 나는이 방법을 수행xml 파일에 키릴 문자 쓰기

xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL); 
... 
snprintf(buf, sizeof(buf), "%s", "тест"); 
xmlTextWriterWriteAttribute(writer, 
          (const xmlChar*)"test_attribute", 
          (const xmlChar*)buf); 

을하지만 결과 XML 파일을 열 때 난 그냥 같이, 내 텍스트의 HTML 표현을 참조하십시오 test_attribute="тест"

나는이 문제를 어떻게 해결할 수 있습니까?

+0

이 맞는 것 같습니다. 텍스트가 인코딩 중입니다. 어떤 인코딩이 선언에 있습니까? – BigMike

+0

그것은 utf-8입니다. 이 질문을 내 질문에 추가했습니다. – hank

답변

2

별도의 utf-8 인코더를 사용해야합니다.

snprintf()에서 텍스트는 UTF-8 (가변 폭 인코딩)이 아니라 CP-1251 (1 바이트 ASCII 시대 인코딩)입니다.

는 레퍼런스 구현이 링크를 참조하십시오 : http://7maze.ru/node/29

코멘트는 러시아어에있는,하지만 당신이 필요 변환 테이블과 끝에

string convertToUtf8(const char* chars, int len) 

기능.

"тест"문자열은 인코딩하는 동안 "РўРчС_С '(절대적으로 의미가없는)처럼 보일 것입니다.

오래된 프로젝트의 오래된 C 코드. CP-866 인코딩 (MS-DOS의 다른 "널리 사용되는"인코딩)을 사용하지만 CP-1251에서의 변환은 간단합니다.

/// CP866 to UTF-8 
char *dosstrtou(char *buffer,const char *dosstr) 
{ 
    char *buf1=buffer; 
    while (*dosstr) 
    { 
     if ((*dosstr>127)&&(*dosstr<176)) 
     { 
      *buf1=208; 
      buf1++; 
      *buf1 = (char)(*dosstr+16); 
      dosstr++; 
      buf1++; 
      continue; 
     }  
     if ((*dosstr>223)&&(*dosstr<240)) 
     { 
      *buf1=209; 
      buf1++; 
      *buf1 = (char)(*dosstr-96); 
      dosstr++; 
      buf1++; 
      continue; 
     }  
     if (*dosstr==240) 
     { 
      *buf1=208; 
      buf1++; 
      *buf1=129; 
      dosstr++; 
      buf1++; 
      continue; 
     }  
     if (*dosstr==241) 
     { 
      *buf1=209; 
      buf1++; 
      *buf1=145; 
      dosstr++; 
      buf1++; 
     } 
     *buf1=*dosstr; 
     buf1++; 
     dosstr++; 
    } 
    *buf1='\0'; 
    return (buffer); 
} 

/// CP1251 to CP866 
char *winstrtodos(char *buffer){ 
    char *ptr=buffer; 
    while (*ptr!='\0') 
    { 
     if ((*ptr>=0x80+0x40)&&(*ptr<=0xAF+0x40)) 
      *ptr =(char)(*ptr-0x40); 
     if ((*ptr>=0xE0+0x10)&&(*ptr<=0xEF+0x10)) 
      *ptr = (char)(*ptr-0x10); 
     if (*ptr==0xA8) *ptr=0xF0; 
     if (*ptr==0xB8) *ptr=0xF1; 
     ptr++; 
    } 
    return (buffer); 
} 

메모리에주의하십시오.

+0

내 기본 인코딩은 cp-1251이 아닌 UTF-8입니다 (Linux에서 작업 중입니다). 그리고 이렇게하면 : xmlTextWriterWriteAttribute (writer, (const xmlChar *) "(xmlChar *)", "тест_знач");), 속성 이름은 정확하지만 속성 값은 여전히 ​​HTML 표현으로 작성됩니다. – hank