libxml2 在 C++, 设置解析器的编码 - "Input is not proper UTF-8"

libxml2 in C++, set encoding for parser - "Input is not proper UTF-8"

本文关键字:Input is not UTF-8 proper 编码 C++ 设置 libxml2      更新时间:2023-10-16

我想要在C++中解析来自Web服务的简单状态消息,即没有编码属性的xml片段。

<message xmlns="http://violation.importer.xyz.de/xsd">
    Der Import-Datensatz mit der Bezeichung="blabla" und der Id=68809 wurde erfolgreich importiert.
</message>

它们似乎在ISO-8859-1中。我可以将解析器设置为这种编码吗?API让我感到困惑

这是我的代码,xml在char*it(迭代器btw)中

xmlNodePtr root_element_ptr;
xmlDocPtr xmldoc_ptr;
xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);
root_element_ptr = xmlDocGetRootElement(xmldoc_ptr);
xmlNodePtr msgnode = root_element_ptr->xmlChildrenNode;
xmlChar *message = xmlNodeListGetString(xmldoc_ptr, msgnode, 1);
response_msg += *message;
response_msg += " / ";
xmlCleanupParser();
xmlFreeDoc(xmldoc_ptr);

这是有效的,但在元音变音符上出现了segfault,在我的日志中我看到了

it.xml:1: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x72 0x7A 0x74

那么这些我必须用什么呢?http://xmlsoft.org/html/libxml-encoding.html

在SO上发布问题后,问题通常会变得更清楚、更容易。以下是我更改的内容,它有效

xmlParserCtxtPtr ctxt_ptr = xmlNewParserCtxt();
xmldoc_ptr = xmlCtxtReadMemory( ctxt_ptr, *it, strlen(*it), "it.xml", "ISO-8859-1", 0);
//xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);