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