LibXML xmlTextReaderReadString 编码

LibXML xmlTextReaderReadString encoding

我正在阅读以 iso-8859-1 编码的 xml 文档。文档中也描述了这种编码: <?xml version="1.0" encoding="ISO-8859-1"?>

当我读取 xml 元素时,我正在获取 utf-8 编码的数据,但我需要 iso-8859-1 进行进一步处理。

我读取文件的代码如下所示:

xmlTextReaderPtr reader;
reader = xmlReaderForFile(sessionFileName, "iso-8859-1", 0);
if (reader != NULL)
{
    ret = xmlTextReaderRead(reader);

    while (ret == 1)
    {
        //only inspect start of elements
        if (xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT)
        {
            ret = xmlTextReaderRead(reader);
            continue;
        }

        //getting node name
        elem_name = xmlTextReaderConstName(reader);

        //getting content of element (text or cdata)
        xmlChar *elem_value = xmlTextReaderReadString(reader);
    }
}

据我了解http://xmlsoft.org/encoding.html,libxml2 在内部以 utf-8 存储所有数据,因此 elem_value 也是 utf-8。 我怎样才能在 iso-8859-1 中获得 elem_value?我有手动转换吗?

这将是我的尝试:

        unsigned char *conv_value;

        if (elem_value)
        {
            int in_size = xmlStrlen(elem_value);
            int out_size  = in_size;

            conv_value = (unsigned char *)malloc((size_t)out_size + 1);

            if (UTF8Toisolat1(conv_value, &out_size, elem_value, &in_size) <= 0 ||
                (in_size - out_size) != 0)
            {
                //error while conversation
                free(conv_value);

                //take original value
                conv_value = elem_value;

                TRACE("error while converting, take utf-8 value");
            }
            else
            {
                conv_value[out_size] = 0; /* null terminating conv_value */
            }
        }

你是对的,从XMLapi中取出后,你需要手动将其从utf-8转换为iso-8859-1。我有效地理解了这一点 "doubles the work" 因为它被转换两次只是为了回到原始编码,但是转换为 UTF-8 是 libxml 解析过程的一个组成部分,并且没有办法告诉它不要这样做。

有利的一面是,如果您使用的内容突然更改为 UTF-8 或 UTF-16 或任何其他字符集,您的 "get it from libxml and covert to iso-8859-1" 代码仍然可以正常工作。