zoukankan      html  css  js  c++  java
  • 解决libxml2不支持中文的问题

    使用libxml2处理xml文件时,默认加载是使用utf-8编码,所以在修改和保存为GB2312编码时,需要将数据转换为utf-8编码,然后再进行修改和保存!

    转换使用iconv,以下是转换代码

    char * ConvertEnc( char *encFrom, char *encTo, const char * in)
    {
     
     static char bufin[1024], bufout[1024], *sin, *sout;
     int mode, lenin, lenout, ret, nline;
     iconv_t c_pt;
     
     if ((c_pt = iconv_open(encTo, encFrom)) == (iconv_t)-1)
     {
      printf("iconv_open false: %s ==> %s/n", encFrom, encTo);
      return NULL;
     }
     iconv(c_pt, NULL, NULL, NULL, NULL);
     
     lenin  = strlen(in) + 1;
     lenout = 1024;
     sin    = (char *)in;
     sout   = bufout;
     ret = iconv(c_pt, &sin, (size_t *)&lenin, &sout, (size_t *)&lenout);
                   
     if (ret == -1)
     {
      return NULL;

     }

     iconv_close(c_pt);
     
     return bufout;
    }

    以下是实例

    test.xml

    <?xml version="1.0" encoding="gb2312"?>
    <parent>测试</parent>

    读取代码

    int main(void)
    {
            xmlDocPtr doc = NULL;
            xmlNodePtr cur = NULL;

            doc = xmlParseFile("test.xml");
            cur = xmlDocGetRootElement(doc);
            printf("%s/n", Convert("utf-8", "gb2312", (char *)xmlNodeGetContent(cur)));
    }
    修改、保存代码

    test2.xml

    <?xml version="1.0" encoding="gb2312"?>
    <story>
      <storyinfo>
        <author>John Fleck</author>
        <datewritten>June 2, 2002</datewritten>
        <keyword>我来也 example keyword</keyword>
        <书目> C++ </书目>
        <测试> test </测试>
      </storyinfo>
      <body>
        <headline>This is the headline</headline>
        <para>This is the body text.</para>
      </body>
    </story>

    xmlDocPtr
    parseDoc(char *docname, char *uri) {

     xmlDocPtr doc;
     xmlNodePtr cur;
     xmlNodePtr newnode;
     xmlAttrPtr newattr;

     doc = xmlParseFile(docname);
     
     if (doc == NULL ) {
      fprintf(stderr,"Document not parsed successfully. /n");
      return (NULL);
     }
     
     cur = xmlDocGetRootElement(doc);
     
     if (cur == NULL) {
      fprintf(stderr,"empty document/n");
      xmlFreeDoc(doc);
      return (NULL);
     }
     
     if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
      fprintf(stderr,"document of the wrong type, root node != story");
      xmlFreeDoc(doc);
      return (NULL);
     }
     
     newnode = xmlNewTextChild (cur, NULL, (xmlChar *)"reference", NULL);
     newattr = xmlNewProp (newnode, (xmlChar *)"uri", (xmlChar *)uri);
     return(doc);
    }

    int main(int argc, char ** argv )
    {
        int options = 0;
        xmlDocPtr doc = NULL;
        char * output = NULL;
        char * szNode = NULL;
        int ret = 0;
       
        xmlAddEncodingAlias("UTF-8", "DVEnc");
        xmlKeepBlanksDefault(0);
     defaultEntityLoader = xmlGetExternalEntityLoader();
     xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
     xmlLineNumbersDefault(1);
     
     szNode = Convert("gb2312", "utf-8", "测试" );
     doc = parseDoc( argv[2], szNode);
     
     ret = xmlSaveFormatFileEnc(output ? output : "-", doc, argv[1], 1);
     if (ret < 0)
     {
          fprintf(stderr, "failed save to %s/n",
                  output ? output : "-");
     }
     return 0;
    }

    执行

    xmlout gb2312 test2.xml

    结果

    <?xml version="1.0" encoding="gb2312"?>
    <story>
      <storyinfo>
        <author>John Fleck</author>
        <datewritten>June 2, 2002</datewritten>
        <keyword>我来也 example keyword</keyword>
        <书目> C++ </书目>
        <测试> test </测试>
      </storyinfo>
      <body>
        <headline>This is the headline</headline>
        <para>This is the body text.</para>
      </body>
      <reference uri="测试"/>
    </story>

  • 相关阅读:
    Vue源码解读-构造函数
    在vue中使用async/await遇到的坑
    vue单页(spa)前端git工程拆分实践
    携带参数隐藏必要参数,瞬间改变浏览器地址
    解析Nuxt.js Vue服务端渲染摸索
    WebSocket的使用(基于VUE与SpringBoot)
    设计模式之桥接(bridge)模式
    设计模式之观察者模式
    设计模式之代理模式、适配器模式和外观模式
    设计模式之工厂模式
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314612.html
Copyright © 2011-2022 走看看