2012-07-12 96 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

對我來說似乎是正確的。文本正在編碼。 decl中存在什麼編碼? – BigMike 2012-07-12 09:58:31

+0

這是utf-8。我已經將這添加到了我的問題中。 – hank 2012-07-12 10:02:15

回答

2

您需要使用單獨的utf-8編碼器。

在snprintf()中,您的文本使用CP-1251(單字節ASCII時代編碼),而不使用UTF-8(可變寬度編碼)。

請參閱此鏈接的參考實現: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

我的默認編碼是UTF-8而不是cp-1251(我在Linux上工作)。當我這樣做:'xmlTextWriterWriteAttribute(writer,(const xmlChar *)「тест_атр」,(const xmlChar *)「тест_знач」);',屬性名稱是正確的,但屬性值仍然寫爲html表示。 – hank 2012-07-13 06:45:08