因为用 xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); 语句默认生成的 XML 结构未指定编码。
如下:
<?xml version="1.0"?>
于是使用 xmlNewDocProp 方法,发现无任何作用,猜测可能是libxml2的bug:
xmlNewDocProp(doc, BAD_CAST "encoding", BAD_CAST "gb2312");
使用方法 doc->encoding = BAD_CAST "gb2312"; 程序运行至该行时直接崩溃。
求助度娘和谷哥,无果。
无意中看到一篇文章,介绍 xmlDocFree()错误时,可以指定 doc->encoding = strdup("GBK");
于是尝试该方法,修改代码如下:
doc->encoding = BAD_CAST strdup("gb2312");
测试OK,生成XML为:
<?xml version="1.0" encoding="gb2312"?>
总结,这里必须用 strdup 复制一个字符串出来,如果直接用常量字符串则会引起崩溃,猜测可能是libxml2库的内存管理问题。