`
baiguomeng
  • 浏览: 998138 次
文章分类
社区版块
存档分类
最新评论

解决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>

分享到:
评论

相关推荐

    libxml2安装包及中文手册

    3. **XSLT转换**:虽然libxml2不包含完整的XSLT处理器,但提供了接口与外部XSLT引擎(如libxslt)配合使用,实现XML到XML或HTML的转换。 4. **XML Schema验证**:libxml2可以对XML文档进行Schema验证,确保其符合预...

    C++的XML编程经验――LIBXML2库使用指南

    ### C++的XML编程经验——LIBXML2库使用指南 ...通过上述介绍,我们可以看到如何在Windows平台上集成并使用LIBXML2库,以及如何解决常见的中文编码问题。希望这篇指南能够帮助更多开发者高效地利用LIBXML2进行XML编程。

    LIBXML2库windows使用指南

    通过以上介绍,我们可以看到LIBXML2库在Windows平台上的使用非常灵活和强大,不仅可以处理各种复杂的XML文档,还能通过ICONV库解决非ASCII字符的问题。希望这些内容能够帮助您更好地理解和使用LIBXML2库。

    个人总结C语言下xml使用全集-libxml.docx

    因此,这篇文档将详细阐述如何在Windows环境下,使用C/C++语言结合Libxml2库进行XML文档操作,并利用Iconv库解决中文编码问题。 首先,你需要下载Libxml2、Iconv和Zlib库。Libxml2依赖于Iconv和Zlib,但这里我们...

    C++ XML.pdf

    - 为解决这一问题,引入Iconv库,专门用于不同编码间的转换,从而增强LibXml2处理多语言XML文档的能力。具体实现上,需在解析XML前或后调用Iconv函数,完成编码转换,确保数据正确读取和显示。 #### 4. **实际应用...

    c 解析xml文件库

    libxml2在处理中文等非英文字符时可能会遇到编码问题。为了解决这些问题,可以结合使用ICONV库进行编码转换。具体做法如下: - 在程序中引入ICONV库的相关头文件。 - 使用iconv_open和iconv函数进行字符集之间的转换...

    Linux下PHP环境搭建

    - 将`AddDefaultCharset ISO-8859-1`中的`ISO-8859-1`改为`GB2312`以解决中文乱码问题。 10. **重启Apache2服务**: - 修改完配置文件后,需重新启动Apache2服务以使更改生效。 11. **设置Apache2文件权限**: - ...

    nagios安装

    本文主要介绍如何在Linux Enterprise 5环境下安装和配置Nagios监控系统,并重点解决Nagios在默认情况下不支持中文的问题。通过详细的步骤说明,帮助读者顺利搭建一套完整的Nagios监控环境。 #### 二、Nagios简介 ...

    UC中文版编辑器(魔域修改ACC -MSG )

    【标签】"UC 中文版编辑器 UE"中的"UE"可能是指Unicode Editor(通用的Unicode编码编辑器)或者Unreal Engine(虚幻引擎),但在这个上下文中,更有可能是指前者,即一个支持中文并提供编辑功能的工具。这个标签暗示...

    PHP5中文手册(chm格式)

    《PHP5中文手册》是PHP开发者不可或缺的参考资料,它详细阐述了PHP5的各种概念、语法、函数以及最佳实践。PHP5作为一个广泛使用的开源脚本语言,尤其在网页开发领域占据了重要地位。本手册以中文呈现,弥补了中文...

    sphinx扩展,适用linux

    Sphinx 是一个强大的全文搜索引擎,尤其适用于实时搜索和大数据量的场景。在 Linux 环境下,Sphinx 的使用可以极大地提升数据检索的效率。...同时,coreseek 对中文的支持,使得在中文环境下使用 Sphinx 成为可能。

    Linux下环境安装配置.pdf

    此外,解决中文乱码问题,可以将`AddDefaultCharset`改为`GB2312`。每次修改配置文件后,都需要重启Apache服务使改动生效。 接下来是libxml2库的安装,它是PHP处理XML文档所必需的。解压缩`libxml2-2.6.11.tar.gz`...

    ubuntu下飞鸽传书的安装

    飞鸽传书默认可能并不支持中文字符集显示,这会影响到聊天功能的正常使用。为解决这一问题,需要对源码进行修改。具体操作是找到src/codeset.c文件,并将其中的IPMSG_PROTO_CODE定义从CP932修改为GBK。这一修改通常...

    php的webservice的wsdl的XML无法显示问题的解决方法

    解决这个问题的关键在于确保文件以正确的字符编码存储和读取,通常推荐使用UTF-8无BOM(Byte Order Mark)编码。 使用Notepad++等文本编辑器可以轻松地转换文件编码。打开文件,选择“编码”菜单,然后选择“转换为...

    lxml学习手册

    - **兼容性**: 支持与Python的标准库libxml2的兼容性。 #### 三、性能测试与优化 lxml在处理大量数据时展现出优秀的性能。 ##### 3.1 性能测试说明 - **一般注意事项**: 在进行性能测试前,了解一些基本的概念是...

    sphinx+xdict+安装说明.zip

    为了克服这个问题,"sphinx-for-chinese"应运而生,它是在Sphinx的基础上添加了对中文的支持,特别是通过集成XDict等中文处理模块,显著提升了中文搜索的效果。 XDict是专门针对中文分词设计的字典库,它包含了大量...

    zabbix-2.0.9.tar

    总之,Zabbix 2.0.9是一个强大的服务器和网络监控解决方案,它能够帮助管理员及时发现和解决IT基础设施的问题,提高系统的稳定性和可靠性。通过深入理解和有效利用这个工具,你可以提升IT运维效率,降低故障发生的...

    jwchat配置后的代码,经过测试可用

    5. **UI本地化**: 修复了中文显示界面的bug,意味着JWChat现在支持中文界面,这在多语言环境中非常重要。可能涉及到修改资源文件或者设置语言包。 6. **安全与认证**: 修复认证失效的bug,意味着JWChat的安全性和...

    ubuntu-64bit安装使用与其上Android所有配置使用

    ##### 4.1 支持中文输入法 - 在 Ubuntu 中安装中文输入法可以通过以下步骤实现: - 打开“系统设置” -&gt; “语言支持” -&gt; “安装/删除语言”。 - 选择“中文”并安装。 - 安装完成后,在“文本输入”设置中添加...

Global site tag (gtag.js) - Google Analytics