C 提取XML文本内容并转换编码(libxml2)

C 提取XML文本内容并转换编码(libxml2),c,libxml2,C,Libxml2,如何从节点提取内容并转换字符编码 我有一个来自文件的“xmlNode*”,它通常是UTF-8,但可以是(我假设)安装支持的任何其他编码 如果它是一个文本节点,我希望在CP850中以字符串的形式获取内容 有一个函数 xmlChar* xmlNodeGetContent(xmlNode* node) 此外,还有如下函数 void xmlDocDumpMemoryEnc(xmlDocPtr out_doc,xmlChar** doc_txt_ptr,int*

如何从节点提取内容并转换字符编码

我有一个来自文件的“xmlNode*”,它通常是UTF-8,但可以是(我假设)安装支持的任何其他编码

如果它是一个文本节点,我希望在CP850中以字符串的形式获取内容

有一个函数

xmlChar* xmlNodeGetContent(xmlNode* node)
此外,还有如下函数

void xmlDocDumpMemoryEnc(xmlDocPtr out_doc,xmlChar** doc_txt_ptr,int*
                         doc_txt_len,const char* txt_encoding)
打印出XML。但我需要像这样的东西

xmlChar* xmlNodeGetContentEnc(xmlNode* node,const char* encoding)
encoding
模块似乎不起作用,因为当我尝试使用编码函数时会出现seg故障(我自己的代码和
xmlsoft.org
中的示例的行为类似)


是否有一种合理简单的方法可以通过
libxml2
实现这一点?

作为旁白,请注意,即使是在欧洲脚本中使用的Unicode字符中,也有许多不是由CP850编码的字符。此外,ISO-8859-15或Windows-1232将更为传统。你确定你特别需要CP850吗?此外,Windows通过宽字符(表示为UTF16)支持全范围的Unicode。在任何情况下,都不需要担心UTF-8以外的编码,因为尽管文档可以用其他方式编码,.CP850在默认情况下不在libxml2支持的编码中。“编码”模块提供了一个框架,通过该框架,您可以插入对其他编码的支持,但这可能不是您在所需编码中获得节点内容的内部表示所需的。据我所知,您需要使用一个单独的转码器,例如can提供的转码器。是的,我特别需要CP 850。我在想,允许使用多种不同的方式在XML中编码字符会很好,这就是我尝试使用libxml2的原因。我的印象是libxml2使用libiconv,但编码模块中的API不起作用。问题可能是libxml2和libiconv之间的链接。不知道你所说的“内部”是什么意思。当我得到CP850字符串时,我不再使用libxml2。教程中的示例程序不起作用,因为它有缺陷。它将
handler->input(out,&out\u size,in,&temp)
的所有非零返回值误解为表示失败,但实际上只有负返回值表示失败。这是教程中的一个缺陷,而不是库中的缺陷。顺便说一句,请注意,即使是在欧洲脚本中使用的Unicode字符中,也有许多不是由CP850编码的字符。此外,ISO-8859-15或Windows-1232将更为传统。你确定你特别需要CP850吗?此外,Windows通过宽字符(表示为UTF16)支持全范围的Unicode。在任何情况下,都不需要担心UTF-8以外的编码,因为尽管文档可以用其他方式编码,.CP850在默认情况下不在libxml2支持的编码中。“编码”模块提供了一个框架,通过该框架,您可以插入对其他编码的支持,但这可能不是您在所需编码中获得节点内容的内部表示所需的。据我所知,您需要使用一个单独的转码器,例如can提供的转码器。是的,我特别需要CP 850。我在想,允许使用多种不同的方式在XML中编码字符会很好,这就是我尝试使用libxml2的原因。我的印象是libxml2使用libiconv,但编码模块中的API不起作用。问题可能是libxml2和libiconv之间的链接。不知道你所说的“内部”是什么意思。当我得到CP850字符串时,我不再使用libxml2。教程中的示例程序不起作用,因为它有缺陷。它将
handler->input(out,&out\u size,in,&temp)
的所有非零返回值误解为表示失败,但实际上只有负返回值表示失败。这是教程中的缺陷,而不是库中的缺陷。